Что такое Generics (обобщенные типы) в Java?

«Что такое Generics (обобщенные типы) в Java?» — вопрос из категории Java Core, который задают на 27% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 повышают читаемость, надежность и повторную используемость кода, являясь фундаментом для коллекций и многих библиотек.