Что можно делать со списком, объявленным как List<? extends Number>?
Читать как Number можно, добавлять нельзя ничего, кроме null: за ссылкой может быть List<Integer> или List<Double>, и компилятор не знает какой. Симметрично List<? super Integer> — добавлять Integer можно, читать — только как Object.
- Удалять элементы и вызывать clear можно
- Захват wildcard через вспомогательный обобщённый метод
- Типичный параметр метода, который только читает
А ещё Возвращать wildcard-типы из методов — плохая практика, неудобно вызывающему
Подробно
За ссылкой может стоять List<Integer> или List<Double>, и компилятор не знает, какой именно, поэтому запрещает добавление: положить Integer в список Double было бы ошибкой. Чтение при этом безопасно — что бы там ни лежало, это точно Number. Симметрично устроен List<? super Integer>: туда можно добавлять Integer и его наследников, но при чтении гарантирован только Object. Правило PECS ровно об этом: producer extends, consumer super. Единственное значение, которое разрешено добавлять в extends-список, — null, поскольку он совместим с любым ссылочным типом.
Что хотят услышать
- Что разрешено и почему.
- Симметрия с super.
Частые ошибки
- Пытаться добавить элемент в коллекцию с ? extends.
- Путать, какая из форм нужна источнику, а какая приёмнику данных.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Читать элементы как Number, но добавлять нельзя ничего, кроме null
- ✗И читать, и добавлять любые наследники Number
- ✗Только добавлять, но не читать
- ✗Ни читать, ни добавлять — такой тип годится лишь для объявления полей
Что спросят дальше
- Как выглядит сигнатура Collections.copy и почему в ней обе формы?
- Что такое безграничный wildcard и когда он уместен?
Разбор темы
- Wildcards и правило PECS
Инвариантность дженериков против ковариантных массивов, ? extends/super, и когда что выбирать по PECS.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.