Что такое дженерики (Generics) в Java?

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

Ответ

Дженерики (Generics) — это механизм параметризации типов в Java, позволяющий создавать классы, интерфейсы и методы, которые работают с различными типами данных, обеспечивая безопасность типов на этапе компиляции.

Основная цель:

  • Типобезопасность: Компилятор проверяет соответствие типов, предотвращая ошибки ClassCastException во время выполнения.
  • Устранение приведения типов: Код становится чище, исчезает необходимость в явных кастах (String).
  • Повторное использование кода: Один обобщённый алгоритм или структура данных может работать с разными типами.

Пример обобщённого класса:

public class Container<T> {
    private T item;

    public void setItem(T item) { this.item = item; }
    public T getItem() { return item; }
}

// Использование с конкретным типом
Container<String> stringContainer = new Container<>();
stringContainer.setItem("Text");
String value = stringContainer.getItem(); // Без приведения типа!

Container<Integer> intContainer = new Container<>();
intContainer.setItem(123);

Важные особенности и ограничения:

  • Стирание типов (Type Erasure): Информация о generic-типах удаляется во время компиляции и недоступна в runtime. List<String> и List<Integer> в runtime — это просто List.
  • Нельзя использовать примитивы: Вместо T нельзя подставить int. Используются классы-обёртки: Integer, Double и т.д.
  • Ограничения при создании экземпляров: Нельзя создать объект generic-типа: new T() или массив new T[size].
  • Wildcards (?, ? extends, ? super): Позволяют создавать гибкие API, работающие с семействами типов.