Что такое параметризованные типы (generics) в Java?

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

Ответ

Параметризованные типы (Generics) — это механизм Java, позволяющий определять классы, интерфейсы и методы с параметрами типов (обычно обозначаются <T>, <K,V>). Это обеспечивает проверку типов на этапе компиляции, устраняя необходимость в явном приведении типов (casting) и снижая риск ошибок ClassCastException во время выполнения.

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

Создание типобезопасных универсальных компонентов.

Пример проблемы БЕЗ Generics:

List list = new ArrayList(); // "Raw" тип
list.add("Hello");
list.add(123); // Компилятор не помешает
String s = (String) list.get(1); // Runtime: ClassCastException!

Решение С Generics:

List<String> list = new ArrayList<>(); // Тип задан явно
list.add("Hello");
// list.add(123); // ОШИБКА КОМПИЛЯЦИИ: несовместимые типы
String s = list.get(0); // Приведение типа не требуется

Ключевые концепции:

  1. Параметр типа (<T>) : Заполнитель для конкретного типа, который будет задан при использовании.
  2. Type Erasure (стирание типов): Информация о generic-типах удаляется компилятором и недоступна во время выполнения. List<String> и List<Integer> в runtime — это просто List.
  3. Ограничения (Bounded Type Parameters): Можно ограничить типы, которые можно подставить.
    // T должен быть подтипом Number
    class Box<T extends Number> { 
        private T value;
    }
    Box<Integer> intBox = new Box<>(); // OK
    Box<String> strBox = new Box<>(); // Ошибка компиляции

Generics широко используются в коллекциях (Collection<T>), утилитных классах (Optional<T>) и при проектировании API.