Параметризованные типы
Дженерик — это «этикетка типа» на контейнере. 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);
}
🎤 Закрыл тему, если можешь объяснить:
• что такое дженерики и зачем они нужны (типобезопасность);
• как объявить свой обобщённый класс с параметром ``.
• как объявить свой обобщённый класс с параметром `