Da https://dzone.com/articles/interface-default-methods-java
Java 8 introduce la nuova funzionalità "Metodo predefinito" o (metodi Defender), che consente allo sviluppatore di aggiungere nuovi metodi alle interfacce senza interrompere l'implementazione esistente di queste interfacce. Fornisce flessibilità per consentire l'implementazione della definizione dell'interfaccia che verrà utilizzata come impostazione predefinita nella situazione in cui una classe concreta non riesce a fornire un'implementazione per quel metodo.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
C'è una domanda comune che le persone chiedono sui metodi predefiniti quando sentono parlare della nuova funzionalità per la prima volta:
E se la classe implementa due interfacce ed entrambe definiscono un metodo predefinito con la stessa firma?
Esempio per illustrare questa situazione:
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 {
}
Questo codice non viene compilato con il seguente risultato:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Per risolvere questo problema, in Clazz, dobbiamo risolverlo manualmente sovrascrivendo il metodo in conflitto:
public class Clazz implements A, B {
public void foo(){}
}
Ma cosa succederebbe se volessimo chiamare l'implementazione predefinita del metodo foo () dall'interfaccia A invece di implementare la nostra.
È possibile fare riferimento a A # foo () come segue:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}