Этап 3 из 11 · ≈ 6 ч

Дженерики

Основа с Middle

Параметризованные типы, стирание, wildcards и правило PECS.

Что важно знать

  • Дженерики проверяются при компиляции и стираются в байткоде.
  • Нельзя new T() и массив T[] напрямую.
  • List<? extends Number> — читать, List<? super Integer> — писать.

Критерии освоения

Middle ≈ 6 ч

  • Пишет обобщённые классы и методы с ограничениями
  • Объясняет стирание типов и его последствия
  • Применяет PECS — extends для чтения, super для записи

Практика. Написать обобщённый кэш и утилиту копирования коллекций с правильными wildcards.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

Вопросы с собеседований

Смотреть все
Что такое generics в Java и зачем нужен wildcard ? extends / ? super?Junior

Дженерики — проверка типов на компиляции без приведений вручную. Wildcard: ? extends T — из коллекции читают как T (производитель), ? super T — в коллекцию пишут T (потребитель). Правило PECS: Producer Extends, Consumer Super.

Полный разбор
Почему List<String> нельзя присвоить переменной типа List<Object>?Middle

Дженерики инвариантны: если бы List<Object> objs = strings компилировалось, через objs можно было бы положить Integer, а потом получить ClassCastException при чтении из списка строк — в совсем другом месте.

Полный разбор
Почему нельзя создать массив параметризованного типа (new List<String>[10] или new T[n])?Senior

Массивы ковариантны и знают тип элемента в рантайме (запись не того типа — ArrayStoreException сразу). Дженерики инвариантны и стёрты. Массив дженериков не смог бы проверить запись — неверный объект попал бы внутрь, и ClassCastException вылез бы далеко, в…

Полный разбор
Что дают дженерики при работе с коллекциями?Junior

Дженерики переносят проверку типов на этап компиляции и убирают ручные приведения при чтении.

Полный разбор
Что можно делать со списком, объявленным как List<? extends Number>?Middle

Читать как Number можно, добавлять нельзя ничего, кроме null: за ссылкой может быть List<Integer> или List<Double>, и компилятор не знает какой. Симметрично List<? super Integer> — добавлять Integer можно, читать — только как Object.

Полный разбор
Когда корректно ставить @SafeVarargs на generic-varargs-метод?Senior

Ставят, когда метод только читает элементы generic-varargs и не сохраняет и не отдаёт созданный массив T[] наружу. Тогда heap pollution невозможен, и аннотация убирает предупреждение у вызывающих.

Полный разбор
Что означает запись List<?> в сигнатуре метода?Junior

List<?> — список неизвестного типа: читать можно как Object, добавлять нельзя ничего, кроме null.

Полный разбор
Что означает стирание типов (type erasure)?Junior

Стирание типов: компилятор проверяет типы, но в байткоде параметр заменяется границей (обычно Object) — в рантайме его нет.

Полный разбор

Разборы темы

← Вся карта «Java»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования