Из List<? extends B> читают B, но нельзя добавлять B/C, кроме допустимого null. В List<? super B> добавляют B и C, но читают как Object. List<B> принимает B/C и возвращает B.
Сравнение списков с wildcard‑типами: extends, super и конкретный тип
Из 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>.