Ответ
Параметризованные типы (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); // Приведение типа не требуется
Ключевые концепции:
- Параметр типа (
<T>) : Заполнитель для конкретного типа, который будет задан при использовании. - Type Erasure (стирание типов): Информация о generic-типах удаляется компилятором и недоступна во время выполнения.
List<String>иList<Integer>в runtime — это простоList. - Ограничения (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.