? extends HasWord
означает «класс / интерфейс, который расширяется HasWord
». Другими словами, HasWord
сам или любой из его детей ... в основном все, что будет работать с instanceof HasWord
плюсом null
.
В более технических терминах ? extends HasWord
это ограниченный подстановочный знак, описанный в пункте 31 « Эффективного Java 3-е издание» , начиная со страницы 139. Та же глава из 2-го издания доступна онлайн в формате PDF ; часть на ограниченных подстановочных знаках - это пункт 28, начиная со страницы 134.
Обновление: PDF-ссылка была обновлена, так как Oracle удалила ее некоторое время назад. Это теперь указывает на копию, размещенную в Университете королевы Марии Лондонской школы электронной инженерии и компьютерных наук.
Обновление 2: давайте более подробно рассмотрим, почему вы хотите использовать подстановочные знаки.
Если вы объявляете метод, чья сигнатура ожидает от вас передачи List<HasWord>
, то единственное, что вы можете передать, это a List<HasWord>
.
Однако, если указанная подпись была, List<? extends HasWord>
тогда вы могли бы передать List<ChildOfHasWord>
вместо.
Обратите внимание, что между List<? extends HasWord>
и есть небольшая разница List<? super HasWord>
. Как сказал Джошуа Блох: PECS = производитель-расширяет, потребитель-супер.
Это означает, что если вы передаете коллекцию, из которой ваш метод извлекает данные (т. Е. Коллекция создает элементы для вашего метода), вы должны использовать ее extends
. Если вы передаете коллекцию, в которую ваш метод добавляет данные (т. Е. Коллекция использует элементы, которые создает ваш метод), его следует использовать super
.
Это может показаться странным. Тем не менее, вы можете увидеть его в List
«S sort
команды (это просто ярлык версии два-Arg из Collections.sort). Вместо того, чтобы взять Comparator<T>
, это на самом деле берет Comparator<? super T>
. В этом случае Компаратор потребляет элементы для List
того, чтобы изменить порядок самого Списка.