Карта / Generics (дженерики) / Параметризованные типы

Параметризованные типы

Дженерик — это «этикетка типа» на контейнере. List<String> — список именно строк. Компилятор сам следит, чтобы внутрь не попало чужое, и не надо вручную приводить типы.

List<String>
add("Аня")
add("Боб")
add(5) — ошибка компиляции
List<Integer>
add(5)
add(42)
add("hi") — ошибка компиляции

Без дженериков пришлось бы хранить всё как Object и приводить тип руками — с риском поймать ошибку в рантайме. Дженерики ловят её на компиляции.

Свой обобщённый класс — тип в угловых скобках:

class Box<T> {      // T — любой тип, подставится при создании
    T value;
    T get() { return value; }
}

Box<String> b = new Box<>();   // теперь T = String
Копнуть глубже

Обобщённые методы — тип объявляется у самого метода, а не у класса:

<T> T first(List<T> list) {
    return list.get(0);
}
🎤 Закрыл тему, если можешь объяснить:
• что такое дженерики и зачем они нужны (типобезопасность);
• как объявить свой обобщённый класс с параметром ``.