Мы привыкли к
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
вносит некоторую путаницу, когда он связан с интерфейсом, это более широкий термин, и его можно использовать для описания обоих случаев. Попробуйте настроить свой разум на концепцию расширения типа (не расширения класса , а не реализации интерфейса ). Вы ограничиваете параметр типа другим типом , и не имеет значения, что это за тип на самом деле. Имеет значение только то, что это верхняя граница и его супертип .