Из List<? extends B> можно читать B, но нельзя добавлять ненулевые объекты. В List<? super B> можно добавлять B и C, но читать безопасно только Object. List<B> поддерживает обе операции с B.
Переписывание кода с учётом различий между List<? extends>, List<? super> и конкретным типом
Из List<? extends B> можно читать B, но нельзя добавлять ненулевые объекты. В List<? super B> можно добавлять B и C, но читать безопасно только Object. List<B> поддерживает обе операции с B.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо изменить существующий код, учитывая следующие вопросы:
- Чем отличаются списки list1, list2 и list3?
- Какие элементы можно добавить в каждый из этих списков?
- Какие типы объектов можно безопасно извлекать из них?
- В каких ситуациях следует использовать ограничение extends, а в каких — super?
class A {}
class B extends A {}
class C extends B {}
List<? extends B> list1 = ...
List<? super B> list2 = ...
List<B> list3 = ...
Ответ
Из List<? extends B> можно читать B, но нельзя добавлять ненулевые объекты. В List<? super B> можно добавлять B и C, но читать безопасно только Object. List<B> поддерживает обе операции с B.
extends описывает неизвестный подтип B: фактически это может быть List<C>, поэтому вставка произвольного B небезопасна. super описывает неизвестный супертип B: им может быть A или Object. В List<B> допустимы экземпляры B и его подклассов, при чтении получается B. Добавление null типологически разрешено во все три списка, но реализация может его запрещать. Правило PECS: producer extends, consumer super; оно касается направления передачи элементов.