Обобщения и коллекции
Карта раздела для повторения:
- Обобщения generics — type parameters, invariance, bounds и erasure;
- Параметризованные методы и конструкторы — собственный параметр метода;
- Обобщения generics — в том числе
? extendsи? super; - Коллекции — иерархия и выбор структуры;
- List, Set, Map и Queue and Deque — основные контракты;
- Iterable — протокол обхода;
- Comparator Java — внешний порядок;
- Equals и hashCode — равенство ключей и элементов;
- Кейс subList изменил исходный список — реальное поведение backed view.
Map<String, List<Long>> idsByType = new HashMap<>();
idsByType.computeIfAbsent("new", ignored -> new ArrayList<>())
.add(42L);Generic-проверка работает при компиляции; в runtime большинство параметров стёрто. Выбор коллекции определяется контрактом: порядок, уникальность, доступ по ключу, сложность операции и конкурентность.
Быстрая проверка
Является ли List<Integer> подтипом List<Number>? Нет, generics инвариантны.
От чего зависит корректность ключа HashMap? Стабильный согласованный контракт equals/hashCode.
Когда нужен ? extends T? Когда структура в основном производит T; добавлять произвольный T в неё нельзя.