De https://dzone.com/articles/interface-default-methods-java
Java 8 introduce una nueva característica de "Método predeterminado" o (métodos de defensa), que permite al desarrollador agregar nuevos métodos a las interfaces sin romper la implementación existente de estas interfaces. Proporciona flexibilidad para permitir la implementación de definición de interfaz que se utilizará de forma predeterminada en la situación en la que una clase concreta no proporcione una implementación para ese método.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
Hay una pregunta común que las personas hacen sobre los métodos predeterminados cuando escuchan sobre la nueva función por primera vez:
¿Qué pasa si la clase implementa dos interfaces y ambas interfaces definen un método predeterminado con la misma firma?
Ejemplo para ilustrar esta situación:
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 {
}
Este código no se puede compilar con el siguiente resultado:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Para solucionarlo, en Clazz, tenemos que resolverlo manualmente anulando el método conflictivo:
public class Clazz implements A, B {
public void foo(){}
}
Pero, ¿qué sucede si quisiéramos llamar a la implementación predeterminada del método foo () desde la interfaz A en lugar de implementar la nuestra?
Es posible referirse a A # foo () de la siguiente manera:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}