Kann eine Schnittstelle mehrere Schnittstellen in Java erweitern? Dieser Code scheint in meiner IDE gültig zu sein und wird kompiliert:
interface Foo extends Runnable, Set, Comparator<String> { }
aber ich hatte gehört, dass Mehrfachvererbung in Java nicht erlaubt war. Warum scheint es eine Ausnahme für Schnittstellen zu geben?
java
inheritance
multiple-inheritance
extends
Prateek
quelle
quelle
Antworten:
Ja, du kannst es schaffen. Eine Schnittstelle kann mehrere Schnittstellen erweitern, wie hier gezeigt:
Eine einzelne Klasse kann auch mehrere Schnittstellen implementieren. Was ist, wenn zwei Schnittstellen eine Methode haben, die denselben Namen und dieselbe Signatur definiert?
Es gibt einen schwierigen Punkt:
Dann funktioniert eine einzelne Implementierung für beide :).
Lesen Sie hier meinen vollständigen Beitrag:
http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html
quelle
void test()
und Schnittstelle B mit habenboolean test()
? (Ist dies ein Cousin des Diamantenproblems ?) __Versucht und das Vernünftige passiert: Nicht erlaubt, wenn der Rückgabetyp unterschiedlich ist.Eine Schnittstelle kann mehrere Schnittstellen erweitern .
Eine Klasse kann mehrere Schnittstellen implementieren .
Eine Klasse kann jedoch nur eine einzelne Klasse erweitern .
Seien Sie vorsichtig, wie Sie die Wörter verwenden
extends
undimplements
wenn Sie überinterface
und sprechenclass
.quelle
Die Antwort lautet: Ja.
Laut JLS
quelle
Von der Oracle - Dokumentation Seite über Mehrfachvererbung Typ, können wir die genaue Antwort finden hier . Hier sollten wir zuerst die Art der Mehrfachvererbung in Java kennen: -
Java "unterstützt nicht die Mehrfachvererbung des Status, aber die Mehrfachvererbung der Implementierung mit Standardmethoden seit der Veröffentlichung von Java 8 und die Mehrfachvererbung des Typs mit Schnittstellen.
Dann stellt sich hier die Frage nach dem "Diamantproblem" und wie Java damit umgeht:
Bei mehrfacher Vererbung der Implementierung gibt der Java-Compiler einen Kompilierungsfehler aus und fordert den Benutzer auf, ihn durch Angabe des Schnittstellennamens zu beheben. Beispiel hier: -
Hier erhalten wir also folgende Fehlermeldung: - Schnittstelle D erbt nicht verwandte Standardeinstellungen für Methode () von Typ B und C Schnittstelle D erweitert B, C.
Sie können es wie folgt beheben: -
Zusammenfassend können wir sagen, dass Java keine Mehrfachvererbung des Status unterstützt , aber eine Mehrfachvererbung der Implementierung und eine Mehrfachvererbung des Typs .
quelle
Sie können mehrere erweitern,
Interfaces
aber Sie können nicht mehrere erweiternclasses
.Der Grund, warum es in Java nicht möglich ist, mehrere Klassen zu erweitern, ist die schlechte Erfahrung aus C ++, wo dies möglich ist.
Die Alternative für die Multipe-Vererbung besteht darin, dass eine Klasse mehrere Schnittstellen implementieren kann (oder eine Schnittstelle mehrere Schnittstellen erweitern kann).
quelle
Ich denke, Ihre Verwirrung liegt in der Mehrfachvererbung, in der es eine schlechte Praxis ist, dies zu tun, und in Java ist dies auch nicht möglich. Die Implementierung mehrerer Schnittstellen ist jedoch in Java zulässig und auch sicher.
quelle
Schauen Sie sich zum Beispiel hier an: http://www.tutorialspoint.com/java/java_interfaces.htm
quelle