2014-10-13 6 views
2

У меня есть следующий код:Почему <? расширяет интерфейс> вместо <? реализует интерфейс>

ArrayList<? extends IValues> valuesList 

IValues является interface. Список заполнен классами/объектами, которые implement интерфейс IValues. Я понимаю концепцию каждого объекта в этом списке, который должен выполнить контракт, установленный интерфейсом, который они реализуют. Почему не язык Java сделать это так:

ArrayList<? implements IValues> valuesList 

? Это было бы намного понятнее пользователю, не так ли?

+3

Как вы думаете, было бы ясно, что 'ArrayList ' соответствует вашему предложенному ограничению? –

+2

Просто произвольный выбор языка. –

ответ

4

Синтаксический выбор того, какое ключевое слово использовать, скорее всего, является произвольным в этом случае. Это всего лишь маркер, говорящий, что аргумент типа должен быть подтипом IValues. Это написано с extends для наследования и implements для интерфейсов.

Лично я считаю, что лучше использовать одно ключевое слово для обоих классов и интерфейсов вместо двух разных. И extends является хорошим выбором, тем более, что вы используете его интерфейсы, а также:

interface ISpecialValues extends IValues { 
    ... 
} 
7

Вот как Generics разработаны на Java. Обратите внимание, что здесь используется и ключевое слово super, но оно имеет совершенно иное значение, чем вне Generics.

1

Существует мало будет для любого extends или implements, так как значения, знакомые с предварительного Java 5 неприменимы в любом случае. Импликация аналогии на самом деле случайна, навязана разработчику языка очень сильным ограничением не вводить новые ключевые слова.

0

Цель выражения заключается в том, чтобы определить, наследует ли класс/интерфейс от IValues (или другой класс/интерфейс в этом отношении). Я предполагаю, что они не используют ключевое слово implements, потому что оба ключевого слова extends или implements решат ту же цель.

Ключевые слова и super используются для определения того, является ли класс/интерфейс дочерним или базовым классом какого-либо другого класса соответственно.

Смежные вопросы