378 Stimmen

Warum ist "extends T" erlaubt, aber nicht "implements T"?

Gibt es in Java einen besonderen Grund für die Verwendung von immer " extends " statt " implements " für die Festlegung von Grenzen von Typparametern?

Zum Beispiel:

public interface C {}
public class A<B implements C>{} 

ist verboten, aber

public class A<B extends C>{} 

ist richtig. Was ist der Grund dafür?

351voto

Tetsujin no Oni Punkte 7222

In der generischen Constraint-Sprache gibt es keinen semantischen Unterschied, ob eine Klasse "implementiert" oder "erweitert". Die Constraint-Möglichkeiten sind "extends" und "super" - das heißt, ist diese Klasse, mit der operiert werden soll, der anderen zuordenbar (extends), oder ist diese Klasse von der anderen zuordenbar (super).

120voto

MikaelF Punkte 3286

Die Antwort liegt in aquí  :

Um einen begrenzten Typparameter zu deklarieren, führen Sie den Namen des Typparameters auf, gefolgt von der extends Schlüsselwort, gefolgt von seinem obere Schranke [ ] . Beachten Sie, dass in diesem Zusammenhang "erweitert" in einem allgemeinen Sinn verwendet wird, um entweder extends (wie in Klassen) oder implements (wie bei den Schnittstellen).

Sie sehen also, es ist etwas verwirrend, und Oracle weiß das.

20voto

beetstra Punkte 7806

Wahrscheinlich, weil für beide Seiten (B und C) nur der Typ relevant ist, nicht die Implementierung. In Ihrem Beispiel

public class A<B extends C>{}

B kann auch eine Schnittstelle sein. "extends" wird verwendet, um Unterschnittstellen und Unterklassen zu definieren.

interface IntfSub extends IntfSuper {}
class ClzSub extends ClzSuper {}

Normalerweise denke ich bei 'Sub extends Super' an ' Unter ist wie Super , aber mit zusätzlichen Fähigkeiten', und 'Clz implementiert Intf' als ' Clz ist eine Realisierung von Intf '. In Ihrem Beispiel würde dies passen: B ist wie C , jedoch mit zusätzlichen Funktionen. Die Fähigkeiten sind hier relevant, nicht die Umsetzung.

8voto

ntg Punkte 10508

Hier ein ausführlicheres Beispiel dafür, wo Erweiterungen zulässig sind und was Sie möglicherweise wünschen:

public class A<T1 extends Comparable<T1>>

8voto

Andrew Tobilko Punkte 45863

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 .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X