? 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того, чтобы изменить порядок самого Списка.