З https://dzone.com/articles/interface-default-methods-java
Java 8 представляє нову функцію «Метод за замовчуванням» або (методи Defender), що дозволяє розробнику додавати нові методи до інтерфейсів, не порушуючи існуючу реалізацію цього інтерфейсу. Він забезпечує гнучкість, дозволяючи інтерфейсу визначати реалізацію, яка використовуватиметься за замовчуванням у ситуації, коли конкретний клас не може забезпечити реалізацію для цього методу.
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();
}
}