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