Что важно знать
- Дженерики проверяются при компиляции и стираются в байткоде.
- Нельзя
new T()и массивT[]напрямую. List<? extends Number>— читать,List<? super Integer>— писать.
Параметризованные типы, стирание, wildcards и правило PECS.
new T() и массив T[] напрямую.List<? extends Number> — читать, List<? super Integer> — писать.Практика. Написать обобщённый кэш и утилиту копирования коллекций с правильными wildcards.
Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.
Дженерики — проверка типов на компиляции без приведений вручную. Wildcard: ? extends T — из коллекции читают как T (производитель), ? super T — в коллекцию пишут T (потребитель). Правило PECS: Producer Extends, Consumer Super.
Полный разборДженерики инвариантны: если бы List<Object> objs = strings компилировалось, через objs можно было бы положить Integer, а потом получить ClassCastException при чтении из списка строк — в совсем другом месте.
Полный разборМассивы ковариантны и знают тип элемента в рантайме (запись не того типа — ArrayStoreException сразу). Дженерики инвариантны и стёрты. Массив дженериков не смог бы проверить запись — неверный объект попал бы внутрь, и ClassCastException вылез бы далеко, в…
Полный разборДженерики переносят проверку типов на этап компиляции и убирают ручные приведения при чтении.
Полный разборЧитать как Number можно, добавлять нельзя ничего, кроме null: за ссылкой может быть List<Integer> или List<Double>, и компилятор не знает какой. Симметрично List<? super Integer> — добавлять Integer можно, читать — только как Object.
Полный разборСтавят, когда метод только читает элементы generic-varargs и не сохраняет и не отдаёт созданный массив T[] наружу. Тогда heap pollution невозможен, и аннотация убирает предупреждение у вызывающих.
Полный разборList<?> — список неизвестного типа: читать можно как Object, добавлять нельзя ничего, кроме null.
Полный разборСтирание типов: компилятор проверяет типы, но в байткоде параметр заменяется границей (обычно Object) — в рантайме его нет.
Полный разборПочему дженерики не дружат с массивами, heap pollution и @SafeVarargs, синтетические bridge-методы и reifiable-типы.
Типобезопасность на компиляции, механизм type erasure и его последствия, дженерик-методы, ограниченные параметры и опасность raw types.
Инвариантность дженериков против ковариантных массивов, ? extends/super, и когда что выбирать по PECS.
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.