Переписывание кода с учётом различий между List<? extends>, List<? super> и конкретным типом

Из List<? extends B> можно читать B, но нельзя добавлять ненулевые объекты. В List<? super B> можно добавлять B и C, но читать безопасно только Object. List<B> поддерживает обе операции с B.

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

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

Из 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; оно касается направления передачи элементов.

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

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

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

Подробнее