generic-типы (java)

243
22 сентября 2017, 18:24

Здравствуйте! Читаю о generic-ах, в качестве примера приводится класс Optional

package chapt03;
public class Optional <T> {
    private T value;
    public Optional() {
    }
    public Optional(T value) {
        this.value = value;
    } 
    public T getValue() {
        return value;
    } 
    public void setValue(T val) {
        value = val;
    } 
    public String toString() {
        if (value == null)
            return null;
        return value.getClass().getName() + " " + value; 
    }
}

Далее в методе main встречается такой фрагмент кода:

//параметризация по умолчанию - Object
Optional ob3 = new Optional();
System.out.println(ob3.getValue());

Далее момент, который никак не могу понять и прошу помочь в нем разобраться. Цитата:

"Объявление generic-типа в виде <T>, несмотря на возможность использовать любой тип в качестве параметра, ограничивает область применения разрабатываемого класса. Переменные такого типа могут вызывать только методы класса Object. Доступ к другим методам ограничивает компилятор, предупреждая возможные варианты возникновения ошибок".

Но в main ob3 вызывает метод класса Optional, который не является методом Object. Что я не так понимаю?

Answer 1

Речь об использовании внутри generic-класса.

public void setValue(T val) {
    value = val;
    // Вот тут на value можно вызывать только методы Object'а
    // Нельзя написать `value.length`, например, рассчитывая на то,
    // что кто-то сделает new Optional<String>
}

А тип самого класса Optional известен и его методы можно вызывать нормально. Так же, как и методы, связанные с генерик-типом там, где он устанавливается:

(new Optional<String>("abc")).getValue().length
READ ALSO
Как использовать passphrase для RSAPrivateKey в java?

Как использовать passphrase для RSAPrivateKey в java?

При кодировании и декодировании я пользуюсь RSA ключами 2048Для дополнительной защищенности требуется использовать passphrase для RSAPrivateKey методом...

371
Отправка части строки в сеть

Отправка части строки в сеть

Имеем сокет, с ним имеем DataInputStream и DataOutputStreamТак-же есть BufferedReader, который читает текст из файла, но через out

269
Как передать массив байт по Json

Как передать массив байт по Json

Приветствую! Есть необходимость передать массив байтов по jsonНо у меня это не получается

410
Проблемы с кодировкой ответа сервера в eclipse

Проблемы с кодировкой ответа сервера в eclipse

Из java-сервлета посылаю на сторонний web-сервер GET запрос, получаю в ответ html код, запихиваю этот код в строкуСмотрю в строку -а русские буквы...

288