Метод должен перекладывать элементы из источника в приёмник. Какая сигнатура правильна по правилу PECS?
void copy(List<? super T> dest, List<? extends T> src): источник производит — extends, приёмник потребляет — super. Так объявлен Collections.copy.
- Сигнатура принимает copy(List<Number>, List<Integer>)
- С List<T> в обоих местах типы пришлось бы совпадать точно
- Comparator<? super T> в sort — тоже потребитель
А ещё Если параметр и читают, и пишут — wildcard не нужен, просто T
Подробно
Источник производит значения, поэтому его тип должен допускать любой подтип T — из такого списка безопасно читать как T. Приёмник потребляет значения, поэтому он должен быть готов принять T, то есть быть списком T или любого его супертипа. Именно так объявлен Collections.copy в стандартной библиотеке. Вариант с двумя List<T> скомпилируется, но окажется неоправданно узким: нельзя будет скопировать List<Integer> в List<Number>. Вариант с безграничными wildcard бесполезен — в такой приёмник ничего не добавить. Полезная оговорка: wildcard имеет смысл в параметрах метода, но не в возвращаемом типе — там он лишь заставит вызывающего иметь дело с wildcard.
Что хотят услышать
- Правильная сигнатура.
- Объяснение через PECS.
Частые ошибки
- Переставить extends и super местами.
- Использовать wildcard в возвращаемом типе метода.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗void copy(List<? extends T> dest, List<? super T> src)
- ✗void copy(List<T> dest, List<T> src)
- ✓void copy(List<? super T> dest, List<? extends T> src)
- ✗void copy(List<?> dest, List<?> src)
Что спросят дальше
- Почему wildcard не стоит возвращать из метода?
- Когда достаточно обычного параметра типа без wildcard?
Разбор темы
- Wildcards и правило PECS
Инвариантность дженериков против ковариантных массивов, ? extends/super, и когда что выбирать по PECS.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.