Здравствуйте! Читаю о 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. Что я не так понимаю?
Речь об использовании внутри generic-класса.
public void setValue(T val) {
value = val;
// Вот тут на value можно вызывать только методы Object'а
// Нельзя написать `value.length`, например, рассчитывая на то,
// что кто-то сделает new Optional<String>
}
А тип самого класса Optional известен и его методы можно вызывать нормально. Так же, как и методы, связанные с генерик-типом там, где он устанавливается:
(new Optional<String>("abc")).getValue().length
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости