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