Ми звикли
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
".