AFAIK, meine Klasse extends
Elternklassen und implements
Schnittstellen. Aber ich stoße auf eine Situation, die ich nicht nutzen kann implements SomeInterface
. Es ist die Deklaration eines generischen Typs. Beispielsweise:
public interface CallsForGrow {...}
public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work!
extends ArrayList<T>
Hier ist das Verwenden implements
syntaktisch verboten. Ich dachte zuerst, dass die Verwendung der Schnittstelle in <> überhaupt verboten ist, aber nein. Es ist möglich, dass ich nur extends
anstelle von verwenden muss implements
. Infolgedessen "erweitere" ich eine Schnittstelle. Dieses andere Beispiel funktioniert:
public interface CallsForGrow {...}
public class GrowingArrayList <T extends CallsForGrow> // this works!
extends ArrayList<T>
Für mich scheint es eine syntaktische Inkonsistenz zu sein. Aber vielleicht verstehe ich einige Finessen von Java 6 nicht? Gibt es noch andere Stellen, an denen ich Schnittstellen erweitern soll? Sollte die Schnittstelle, die ich erweitern möchte, einige Besonderheiten aufweisen?
quelle
extends
undimplements
, nur wenn man das Problem aus der Perspektive eines reinen Typsystems betrachtet, gibt es keinen Unterschied.T
ist eine klasse?T
könnte auf einen Schnittstellentyp oder einenenum
Typ verweisen .:
. Und im Hintergrund war und ist eine Schnittstelle eine abstrakte Klasse mit der Einschränkung, dass sie nur nicht implementierte virtuelle (abstract
) Mitglieder enthält, um Mehrfachvererbung zu ermöglichen. Es gibt buchstäblich keinen Unterschied zwischenimplements
undextends
. Sie könnten beide durch dasselbe Wort (extends
) oder durch ein beliebiges Symbol (:
) ersetzt werden und nichts würde verloren gehen.Als Java 5, und insbesondere Generika, Entwicklern zur Verfügung gestellt wurde, die ein Interesse angemeldet hatten, war die Syntax ganz anders. Anstelle von
Set<? extends Foo>
und hatteSet<? super Bar>
esSet<+Foo>
undSet<-Foo>
. Die Rückmeldung war jedoch, dass nicht klar war, ob+
dies spezifischer oder umfassender gemeint war (mehr Klassen) . Sun reagierte auf dieses Feedback mit einer Änderung der Syntax, unter der Einschränkung, keine neuen Schlüsselwörter einzuführen, was ein Problem für die Abwärtskompatibilität gewesen wäre.Das Ergebnis ist, dass beides nicht ganz natürlich ist. Wie Sie sehen,
extends
ist es überladen, von Klassen zu sprechen, die Schnittstellen "erweitern", was in anderen Kontexten nicht die Sprache ist. undsuper
ist überladen, um "ist eine Superklasse von" zu bedeuten, was die entgegengesetzte Richtung der Beziehung ist, die zuvor durch das Schlüsselwort ausgedrückt wurde, dh sich auf eine Superklasse bezieht.Die Grundlagen einer Schnittstelle sind von dieser Änderung jedoch nicht betroffen, und es werden keine speziellen Schnittstellen eingeführt, die auf neue Weise erweitert werden.
quelle
Das Zulassen und Verbieten einer solchen Syntax hat Nachteile, und das Zulassen ist weitaus größer.
Man denke nur daran.
Die Trennung von Schnittstelle und Implementierung ist eine der grundlegenden Programmiersprachen. Aus diesem Grund ist die Syntax, die es erlaubt, "Interface implementiert etwas" zu buchstabieren , ungefähr so schlecht wie die Verwendung eines Pluszeichens, um die Multiplikation von Operanden zu kennzeichnen .
quelle
Man muss die schnittstellengesteuerte Programmierung als nächsten Schritt verstehen, während man eine Schnittstelle versteht. Hier erfahren Sie, wie die Benutzeroberfläche tatsächlich verwendet wird. Welche Rolle spielt es in einem Java-Programm (oder einer anderen Sprache)?
quelle