Ответ
Generics — это механизм параметризации типов в классах, интерфейсах и методах. Они обеспечивают безопасность типов на этапе компиляции, устраняя необходимость в явных приведениях типов (cast) и снижая риск ClassCastException.
Основная цель: Создание компонентов, которые могут работать с разными типами, оставаясь типобезопасными.
// Без Generics (небезопасно)
List list = new ArrayList();
list.add("test");
String s = (String) list.get(0); // Требуется явное приведение
// С Generics (безопасно)
List<String> safeList = new ArrayList<>();
safeList.add("test");
String s = safeList.get(0); // Приведение не требуется
// safeList.add(10); // Ошибка компиляции
Ключевые концепции:
- Параметры типа (
T,E,K,V) – используются в объявлении. - Wildcards (подстановочные знаки):
<?>– неизвестный тип (неограниченный).<? extends T>– «producer», чтение (верхняя граница).<? super T>– «consumer», запись (нижняя граница).
- Стирание типов (Type Erasure): Информация о generic-типах удаляется во время компиляции и недоступна во время выполнения. Это накладывает ограничения (например, нельзя создать
new T()или проверитьinstanceof T).
Почему это важно: Generics повышают читаемость, надежность и повторную используемость кода, являясь фундаментом для коллекций и многих библиотек.