Wir sind gewohnt an
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
und jede geringfügige Abweichung von diesen Regeln verwirrt uns sehr.
Die Syntax eines gebundenen Typs ist definiert als
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12> 4.4. Typvariablen>TypeBound
)
Wenn wir es ändern würden, würden wir den implements
Fall sicherlich hinzufügen
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
und am Ende zwei identisch verarbeitete Klauseln
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12> 4.3. Referenztypen und Werte>ClassOrInterfaceType
)
außer wir müssten uns auch darum kümmern implements
, was die Sache noch komplizierter machen würde.
Ich glaube, es ist der Hauptgrund, warum extends ClassOrInterfaceType
anstelle von extends ClassType
und implements InterfaceType
- verwendet wird, um die Dinge innerhalb des komplizierten Konzepts einfach zu halten. Das Problem ist , dass wir nicht das richtige Wort sowohl zur Deckung haben extends
und implements
wir definitiv nicht wollen , eine einzuführen.
<T is ClassTypeA>
<T is InterfaceTypeA>
Obwohl extends
es mit einer Schnittstelle etwas Chaos bringt, ist es ein weiter gefasster Begriff und kann verwendet werden, um beide Fälle zu beschreiben. Versuchen Sie, sich auf das Konzept der Erweiterung eines Typs einzustellen (keine Klasse erweitern , keine Schnittstelle implementieren ). Sie beschränken einen Typparameter auf einen anderen Typ, und es spielt keine Rolle, um welchen Typ es sich tatsächlich handelt. Es ist nur wichtig, dass es seine Obergrenze und sein Supertyp ist .
implements
?" - "Weil es nur gibtextends
".