Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 исключения».
Предыдущая статья — «Java 8 ещё раз о перегрузке методов».
Обобщения (Generics) позволяют указать ограничения, накладываемое на поведение класса или методов, в терминах неизвестных типов.
Содержание
Простой класс Lair
Обобщённая версия класса Lair
Соглашение об именовании переменных типа
Создание экземпляра обобщённого типа и обращение к нему
Бриллиантовая операция (Diamond operator)
Несколько параметров типа
Параметризованный тип
Сырой тип (Raw type)
Сообщения об ошибках “unchecked”
Обобщённые методы
Ограниченные параметры типа
Обобщения, наследование и дочерние типы
Выведение типов
— Выведение типов и обобщённый методы
— Выведение типов и создание экземпляра обобщённого класса
— Выведение типа и обобщённые конструкторы обобщённых и необобщённых классов
— Целевые типы
Подстановочный символ (wildcard)
— Подстановочный символ, ограниченный сверху (Upper bounded wildcard)
— Неограниченный подстановочный символ (Unbounded wildcard)
— Ограниченный снизу подстановочный символ (Lower bound Wildcard)
— Подстановочные символы и дочерние типы
— Захват символа подстановки (Wildcard Capture) и вспомогательные методы
— Руководство по использованию подстановочного символа
Стирание типа (Type Erasure)
— Стирание типа в обобщённых типах
— Стирание типа в обобщённых методах
— Влияние стирания типа и методы-мосты (bridge methods)
— —Методы-мосты (Bridge Methods)
— Загрязнение кучи (Heap pollution)
— Потенциальные уязвимости методов с произвольным числом параметров с нематериализуемыми формальными параметрами
— Подавление предупреждений для методов с произвольным количеством параметров с нематериализуемыми формальными параметрами
Ограничения обобщений
— Нельзя создавать экземпляры обобщённых типов с примитивными типами в качестве аргументов типа.
— Нельзя создавать экземпляры параметров типа
— Нельзя объявлять статические поля с типом параметра типа
— Нельзя использовать приведения типа или instanceof с параметризованными типами
— Невозможно создавать массивы параметризованных типов
— Нельзя создавать, ловить (catch) или бросать (throw) объекты параметризованных типов
— Нельзя перегружать метод так, чтобы формальные параметры типа стирались в один и тот же сырой тип