Umsetzung von zwei Schnittstellen mit zwei Standard-Methoden die gleiche Signatur in Java 8
Angenommen ich habe zwei Schnittstellen:
public interface I1
{
default String getGreeting() {
return "Good Morning!";
}
}
public interface I2
{
default String getGreeting() {
return "Good Afternoon!";
}
}
Wenn ich will, zu implementieren, die sowohl von Ihnen, welche Implementierung verwendet wird?
public class C1 implements I1, I2
{
public static void main(String[] args)
{
System.out.println(new C1().getGreeting());
}
}
- Was ist, Wenn
I2
erstrecktI1
undC1
implementiertI2
!!? Ich denke, dass das kompilieren...oder bin ich da falsch ? - Vielen Dank für die Frage! Ich habe gerade ausprobiert: ja, das kompiliert wird, unabhängig getGreeting() in I1 ist abstrakte oder default. Wenn die Methode in I1 ist Standard, das bedeutet, Sie können das überschreiben der default-Implementierung in der Schnittstelle-intheritance...
- Ja genau...Es wird geerbte Methode.
- Hier ist ein Artikel über die Standard-Methoden : Java 8 : Default-Methode in Interface
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine compile-Zeit-Fehler. Sie können nicht zwei Durchführung von zwei Schnittstellen.
Allerdings ist es richtig, wenn Sie implementieren die
getGreeting
Methode inC1
:Ich möchte nur hinzufügen, dass selbst wenn die Methode in I1 ist Abstrakt, und Standard in I2, die Sie nicht implementieren kann, beide. Das ist also auch eine compile-Zeit-Fehler:
Dies ist nicht spezifisch für die Frage. Aber, ich denke immer noch, dass es fügt einige Wert auf den Kontext. Als Ergänzung zu @toni77 Antwort, möchte ich hinzufügen, dass die Standard-Methode kann aufgerufen werden, die von einer implementierenden Klasse, wie unten gezeigt. In dem folgenden code die Standard-Methode
getGreeting()
ausinterface I1
aus aufgerufen wird, eine überschriebene Methode:Wenn eine Klasse implementiert 2 interfaces, die beide einen java-8 Standard-Methode mit der gleichen Signatur (wie in deinem Beispiel) die implementierende Klasse ist verpflichtet zum überschreiben der Methode. Die Klasse kann immer noch Zugriff auf die Standard-Methode mit
I1.super.getGreeting();
. Es kann den Zugriff entweder beide oder keines von beiden. So wäre das folgende eine gültige Implementierung von C1Es ist ein Fall, wo das tatsächlich funktioniert entsprechend der Auflösung Regeln. Wenn eine der Schnittstellen erweitert der anderen.
Verwenden das Beispiel von oben:
Das Ergebnis wäre:
Guten Tag!
Aber ich glaube, das wird ein großes problem sein. Der ganze Grund für die Standard-Schnittstellen ist es, library-Entwickler zu entwickeln apis, ohne zu brechen Praktiker.
Verständlicherweise Sie erlauben nicht, die Methoden zu kompilieren, ohne die erbschaft-Struktur über die Verlängerung, da es eine library-Entwickler könnten möglicherweise hijack Verhalten.
Jedoch, das das Potenzial hat, sich selbst zu besiegen. Wenn eine Klasse zwei Schnittstellen implementiert, die nicht von einer hierarchischen Ansicht, aber beide definieren die gleiche Standard-Signatur der Methode, dann die Klasse, die Sie erweitert, beide Schnittstellen wird nicht kompiliert. (wie oben gezeigt)
Ist es denkbar, dass zwei verschiedene library-Entwickler könnten sich entscheiden, zum hinzufügen von Standard-Methoden zu verschiedenen Zeiten, mit gemeinsamen Unterschriften; in der Tat ist es wahrscheinlich, dass dies geschehen wird, in den Bibliotheken, die bei der Umsetzung vergleichbarer Konzepte wie die Mathematik-Bibliotheken. Wenn Sie geschehen zu sein der tut mir Leid soul implementieren beide Schnittstellen in der gleichen Klasse, die Sie gebrochen werden, auf update.
Ich glaube, die Regel ist, dass die Klasse die Implementierung der doppelten Standard-Methoden 'müssen' überschreiben, die Umsetzung.. Die folgenden kompiliert und läuft einwandfrei...