Von https://dzone.com/articles/interface-default-methods-java
Java 8 führt die neue Funktion "Standardmethode" oder (Verteidigungsmethoden) ein, mit der Entwickler den Schnittstellen neue Methoden hinzufügen können, ohne die vorhandene Implementierung dieser Schnittstelle zu beeinträchtigen. Es bietet Flexibilität, um die Implementierung einer Schnittstellendefinition zu ermöglichen, die standardmäßig verwendet wird, wenn eine konkrete Klasse keine Implementierung für diese Methode bereitstellt.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
Es gibt eine häufig gestellte Frage zu Standardmethoden, wenn sie zum ersten Mal von der neuen Funktion erfahren:
Was ist, wenn die Klasse zwei Schnittstellen implementiert und beide Schnittstellen eine Standardmethode mit derselben Signatur definieren?
Beispiel zur Veranschaulichung dieser Situation:
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public interface B {
default void foo(){
System.out.println("Calling B.foo()");
}
}
public class ClassAB implements A, B {
}
Dieser Code kann nicht mit folgendem Ergebnis kompiliert werden:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Um dies zu beheben, müssen wir es in Clazz manuell beheben, indem wir die widersprüchliche Methode überschreiben:
public class Clazz implements A, B {
public void foo(){}
}
Was aber, wenn wir die Standardimplementierung der Methode foo () von Schnittstelle A aus aufrufen möchten, anstatt unsere eigene zu implementieren?
Es ist möglich, auf A # foo () wie folgt zu verweisen:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}