Z https://dzone.com/articles/interface-default-methods-java
Java 8 wprowadza nową funkcję „Metoda domyślna” lub (metody Defendera), która umożliwia programistom dodawanie nowych metod do interfejsów bez przerywania istniejącej implementacji tych interfejsów. Zapewnia elastyczność pozwalającą na definiowanie implementacji interfejsu, która będzie używana jako domyślna w sytuacji, gdy konkretna klasa nie zapewni implementacji dla tej metody.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
Jest jedno częste pytanie, które ludzie pytają o metody domyślne, gdy po raz pierwszy słyszą o nowej funkcji:
Co się stanie, jeśli klasa implementuje dwa interfejsy i oba te interfejsy definiują domyślną metodę z tym samym podpisem?
Przykład ilustrujący tę sytuację:
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 {
}
Ten kod nie może zostać skompilowany z następującym wynikiem:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Aby to naprawić, w Clazz musimy rozwiązać to ręcznie, zastępując metodę powodującą konflikt:
public class Clazz implements A, B {
public void foo(){}
}
Ale co by było, gdybyśmy chcieli wywołać domyślną implementację metody foo () z interfejsu A zamiast implementować naszą własną.
Do A # foo () można odwoływać się w następujący sposób:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}