Дженерики

Сырой тип

Дженерик без информации о его типе называется сырым типом. Например, для MyClass<T> сырым типом будет MyClass.

Ссылочная переменная сырого типа не имеет информации о типе дженерика, на который она указывает. Раз информации нет, значит привязанный дженерик будет работать с типом Object. А следовательно, в него можно передать что угодно, а получить из него можно только Object, либо выполнить явное приведение типа. ... Читать дальше »

<?> Таблица операций

Типы ссылочных wildcard-переменных и типы объектов, которые могут быть считаны и записаны через них.
тип переменной тип считываемого объекта тип записываемого объекта
list<?> Object n/a
list<? extends MyClass> MyClass n/a
list<? super MyClass> Object MyClass и его подклассы

<? super Type> - ограничение снизу

<? super Type> - ограничение типа аргумента снизу. Нижнее ограничение подразумевает, что переменная может ссылаться на любой объект, стоящий не ниже Type по иерархии (тип является либо Type, либо его суперклассом).

В качестве Type могут выступать классы, интерфейсы и enum. ... Читать дальше »

<? extends Type> - ограничение сверху

<? extends Type> - ограничение типа аргумента сверху. Верхнее ограничение подразумевает, что переменная может ссылаться на любой объект, стоящий не выше Type по иерархии (тип является либо Type, либо его наследником).

В качестве Type могут выступать классы, интерфейсы и enum. Если в качестве ограничивающего типа выступает интерфейс, для него всё равно используется ключевое слово "extends". ... Читать дальше »

<?> то же самое, что <Object>

При использовании подстановочного знака (wildcard) "?" в качестве типа параметра при определении переменной или параметра метода, информация о типе объекта теряется, для компилятора он становится просто Object. ... Читать дальше »

Дженерики. Наследование

При наследовании одного дженерика другим типы их параметров должны либо совпадать, либо для родительского класса должен быть указан конкретный тип. ... Читать дальше »