Mit einer neuen Funktion in JDK 8 können Sie eine vorhandene Schnittstelle erweitern und gleichzeitig die Binärkompatibilität beibehalten.
Die Syntax ist wie
public interface SomeInterface() {
void existingInterface();
void newInterface() default SomeClass.defaultImplementation;
}
Auf diese Weise SomeInterface
treten bei allen vorhandenen Implementierungen beim Upgrade auf diese neue Version nicht alle plötzlich Kompilierungsfehler auf newInterface()
.
Was passiert, wenn Sie zwei Schnittstellen implementieren, die beide eine neue Standardmethode hinzugefügt haben, die Sie nicht implementiert haben? Lassen Sie mich anhand eines Beispiels erklären.
public interface Attendance {
boolean present() default DefaultAttendance.present;
}
public interface Timeline {
boolean present() default DefaultTimeline.present;
}
public class TimeTravelingStudent implements Attendance, Timeline {
}
// which code gets called?
new TimeTravelingStudent().present();
Wurde dies bereits als Teil von JDK 8 definiert?
Ich fand die Java-Götter, die hier über etwas Ähnliches sprachen: http://cs.oswego.edu/pipermail/lambda-lib/2011-February/000068.html , aber es ist Teil der privaten Mailingliste und ich kann sie nicht direkt fragen.
Weitere Informationen zur Verwendung der Standardeinstellungen in JDK 8 und zur Erweiterung der Collection-Oberfläche zur Unterstützung von Lambdas finden Sie hier: https://oracleus.wingateweb.com/published/oracleus2011/sessions/25066/25066_Cho223662.pdf
Antworten:
Die Antwort auf die doppelte Operation lautet:
Meine Antwort auf Ihre Frage lautet: Ja, es handelt sich um eine Form der Mehrfachvererbung, da Sie Verhalten von verschiedenen Eltern erben können. Was fehlt, ist das Erben von Zuständen, dh Attributen.
quelle
Ich weiß, dass dies ein alter Beitrag ist, aber da ich mit diesem Zeug arbeite ...
Sie erhalten einen Fehler vom Compiler, der Ihnen Folgendes mitteilt:
quelle
Es gibt zwei Szenarien:
1) Zunächst wurde erwähnt, dass es keine spezifischste Schnittstelle gibt
2) Zweitens, wenn es eine spezifischere Schnittstelle gibt:
quelle
Ja, aber Sie können Ihrer Schnittstelle Getter und Setter hinzufügen, die die implementierenden Klassen dann implementieren müssen. Trotzdem erben die implementierenden Klassen keine Attribute. AFAICS ähnelt also eher einer Lösung im Trait-Stil als einer Lösung im Stil der Mehrfachvererbung.
quelle
Kurz gesagt: Es handelt sich um einen Fehler bei der Kompilierung, der die Methode in der Implementierung manuell überschreiben muss.
Zweck der Standardmethode
Der Hauptzweck der Einführung der Standardmethode in Java 8 besteht darin, die Schnittstelle erweiterbar zu machen, ohne vorhandene Implementierungen zu beschädigen (es gibt so viele Java-Bibliotheken von Drittanbietern).
Und
multiple inheritance
wie in C ++ eigentlich vermieden werden soll, ist das definitiv nicht der Zweck der Standardmethode in Java.So überschreiben Sie
2 Optionen:
super
Format auf:<interface_name>.super.<method_name>();
Tipps:
public
beim Überschreiben ein Schlüsselwort hinzuzufügen .quelle
Wenn noch jemand nach einer Antwort sucht und eine Klasse zwei Schnittstellen mit derselben Standardmethode implementiert, muss die Klasse die Eindeutigkeit auflösen, indem sie eine eigene Implementierung bereitstellt. In diesem Lernprogramm finden Sie weitere Informationen zur Funktionsweise der Vererbung in Standardmethoden.
quelle
"Wie werden wir die Methoden unterscheiden?" War eine Frage, die auf Stackoverflow gestellt wurde und auf diese Frage konkrete Methoden in Schnittstellen Java1.8 verwies
Das folgende Beispiel sollte diese Frage beantworten:
Die obige Klasse C muss eine eigene konkrete Methode für die Schnittstellen A und B implementieren.
Um eine konkrete Implementierung einer Methode von einer bestimmten Schnittstelle aus aufzurufen , können Sie die Schnittstelle instanziieren und die konkrete Methode dieser Schnittstelle explizit aufrufen
Der folgende Code ruft beispielsweise die konkrete Implementierung der Methode m () von der Schnittstelle A auf :
Die Ausgabe der oben genannten wäre:
Schnittstelle A: m ()
quelle
Meines Erachtens handelt es sich nicht um Mehrfachvererbung, da sie zustandslos sind. Virtuelle Erweiterungsmethoden unterstützen daher nicht die vollständige Objekt- oder Klassenfunktionalität.
quelle