С https://dzone.com/articles/interface-default-methods-java
В Java 8 представлена новая функция «Метод по умолчанию» или (Методы Защитника), которая позволяет разработчику добавлять новые методы в интерфейсы, не нарушая существующую реализацию этих интерфейсов. Он обеспечивает гибкость, позволяя интерфейсу определять реализацию, которая будет использоваться по умолчанию в ситуации, когда конкретный класс не может предоставить реализацию для этого метода.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
Есть один общий вопрос, который люди задают о методах по умолчанию, когда впервые слышат о новой функции:
Что, если класс реализует два интерфейса, и оба этих интерфейса определяют метод по умолчанию с одинаковой сигнатурой?
Пример, иллюстрирующий эту ситуацию:
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 {
}
Этот код не компилируется со следующим результатом:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Чтобы исправить это, в Clazz мы должны решить это вручную, переопределив конфликтующий метод:
public class Clazz implements A, B {
public void foo(){}
}
Но что, если бы мы хотели вызвать реализацию метода foo () по умолчанию из интерфейса A вместо реализации нашей собственной.
Можно ссылаться на A # foo () следующим образом:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}