Сравнение списков с wildcard‑типами: extends, super и конкретный тип

Из List<? extends B> читают B, но нельзя добавлять B/C, кроме допустимого null. В List<? super B> добавляют B и C, но читают как Object. List<B> принимает B/C и возвращает B.

Короткий ответ

Что ответить на собеседовании

Из List<? extends B> читают B, но нельзя добавлять B/C, кроме допустимого null. В List<? super B> добавляют B и C, но читают как Object. List<B> принимает B/C и возвращает B.

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

Ответ с пояснениями

Условие

Нужно разобраться в различиях между коллекциями, объявленными с использованием wildcard‑типов.

  • Чем отличаются upList, downList и exactList?
  • Какие элементы можно добавить в каждую из этих коллекций?
  • Какие элементы можно извлечь из каждой коллекции?
class A {}
class B extends A {}
class C extends B {}
List<? extends B> upList = ...
List<? super B> downList = ...
List<B> exactList = ...

Ответ

Из List<? extends B> читают B, но нельзя добавлять B/C, кроме допустимого null. В List<? super B> добавляют B и C, но читают как Object. List<B> принимает B/C и возвращает B.

Причина: extends скрывает конкретный подтип списка — это может быть List<C>, куда B добавлять нельзя. super скрывает надтип — это может быть List<Object>, где уже лежат другие объекты. Это правило PECS: producer extends, consumer super. A добавлять в downList нельзя, потому что реальный список может быть List<B>.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее