Предназначение:
Используется, если мы изначально не знаем, с каким типом будет работать создаваемый объект.
Терминология:
Параметризация типов:
Параметризация объектов:
Параметризация методов:
В качестве параметра Generic-объекты принимают только объекты. Поэтому для параметризирования примитивами используются классы-оболочки (wrappers).
При объявлении можно наложить ограничения на значение параметра generic:
class A <T extends B & J1 & J2> {…}
Пусть J1, J2 - интерфейсы. Тогда:
- если B – интерфейс, T – интерфейс, обязан наследовать B, J1, J2;
- если B – класс, T – класс, обязан наследовать B, реализовывать J1, J2. Внутри generic нельзя:
создать объект этого типа
создать массив такого типа
использовать в секции catch
использовать в статическом контексте
использовать в instanceof (справа)
наследовать
Объявить переменную типа массив параметризованных типов можно. Создать массив нельзя. Исключение (допустимо только для параметризованного wildcard без ограничений):
Классы Void, Boolean и Character наследуются напрямую от Object. Остальные - расширяют java.lang.Number.