Мы привыкли к
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
и любое небольшое отклонение от этих правил очень смущает нас.
Синтаксис привязки типа определяется как
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12> 4.4. Типовые переменные>TypeBound
)
Если бы мы изменили это, мы обязательно добавили бы implements
случай
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
и в конечном итоге с двумя одинаково обработанными предложениями
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12> 4.3. Типы ссылок и значения>ClassOrInterfaceType
)
кроме нас также нужно было бы позаботиться о том implements
, что еще больше усложнит ситуацию.
Я полагаю, что это главная причина, почему extends ClassOrInterfaceType
используется вместо extends ClassType
и implements InterfaceType
- чтобы все было просто в рамках сложной концепции. Проблема в том , что мы не имеем право слова , чтобы охватить как extends
и implements
мы определенно не хотим , чтобы ввести одну.
<T is ClassTypeA>
<T is InterfaceTypeA>
Хотя это extends
вносит некоторую путаницу, когда речь идет о интерфейсе, это более широкий термин, и его можно использовать для описания обоих случаев. Попробуйте настроить свой разум на идею расширения типа (не расширения класса , не реализации интерфейса ). Вы ограничиваете параметр типа другим типом, и не имеет значения, что это за тип на самом деле. Имеет значение только то, что это его верхняя граница и его супертип .
implements
?" - «Потому что есть толькоextends
».