Wir sind es gewohnt
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
und jede kleine Abweichung von diesen Regeln verwirrt uns sehr.
Die Syntax einer Typbindung ist definiert als
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12 > 4.4. Typ-Variablen > TypeBound
)
Wenn wir es ändern würden, würden wir sicherlich die implements
Fall
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
und landen bei zwei identisch verarbeiteten Klauseln
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12 > 4.3. Referenztypen und -werte > ClassOrInterfaceType
)
außer dass wir uns auch um Folgendes kümmern müssen implements
was die Sache noch komplizierter machen würde.
Ich glaube, das ist der Hauptgrund, warum extends ClassOrInterfaceType
verwendet wird, statt extends ClassType
y implements InterfaceType
- um die Dinge innerhalb des komplizierten Konzepts einfach zu halten. Das Problem ist, dass wir nicht das richtige Wort haben, um beides abzudecken extends
y implements
und wir wollen auf keinen Fall eine einführen.
<T is ClassTypeA>
<T is InterfaceTypeA>
Obwohl extends
bringt ein gewisses Durcheinander mit sich, wenn es mit einer Schnittstelle einhergeht, es ist ein weiter gefasster Begriff und kann zur Beschreibung beider Fälle verwendet werden. Versuchen Sie, sich auf das Konzept der Erweiterung eines Typs (nicht eine Klasse erweitern , nicht Implementierung einer Schnittstelle ). Sie schränken einen Typ-Parameter durch eine andere Art und es spielt keine Rolle, um welchen Typ es sich handelt. Wichtig ist nur, dass es sein obere Schranke und es ist sein Supertyp .