Получить доступ

Метод должен перекладывать элементы из источника в приёмник. Какая сигнатура правильна по правилу PECS?

MiddleДженерики
Коротко

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Источник производит значения, поэтому его тип должен допускать любой подтип T — из такого списка безопасно читать как T. Приёмник потребляет значения, поэтому он должен быть готов принять T, то есть быть списком T или любого его супертипа. Именно так объявлен Collections.copy в стандартной библиотеке. Вариант с двумя List<T> скомпилируется, но окажется неоправданно узким: нельзя будет скопировать List<Integer> в List<Number>. Вариант с безграничными wildcard бесполезен — в такой приёмник ничего не добавить. Полезная оговорка: wildcard имеет смысл в параметрах метода, но не в возвращаемом типе — там он лишь заставит вызывающего иметь дело с wildcard.

Что хотят услышать

  • Правильная сигнатура.
  • Объяснение через PECS.

Частые ошибки

  • Переставить extends и super местами.
  • Использовать wildcard в возвращаемом типе метода.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓void copy(List<? super T> dest, List<? extends T> src)
  • ✗void copy(List<? extends T> dest, List<? super T> src)
  • ✗void copy(List<T> dest, List<T> src)
  • ✗void copy(List<?> dest, List<?> src)

Что спросят дальше

  • Почему wildcard не стоит возвращать из метода?
  • Когда достаточно обычного параметра типа без wildcard?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем