De https://dzone.com/articles/interface-default-methods-java
Java 8 introduz o novo recurso “Método padrão” ou (métodos Defender), que permite ao desenvolvedor adicionar novos métodos às interfaces sem quebrar a implementação existente dessas interfaces. Ele fornece flexibilidade para permitir que a interface defina a implementação que será usada como padrão na situação em que uma classe concreta falha em fornecer uma implementação para aquele método.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
Há uma pergunta comum que as pessoas fazem sobre os métodos padrão quando ouvem sobre o novo recurso pela primeira vez:
E se a classe implementar duas interfaces e ambas as interfaces definirem um método padrão com a mesma assinatura?
Exemplo para ilustrar esta situação:
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 falha ao compilar com o seguinte resultado:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Para corrigir isso, em Clazz, temos que resolver isso manualmente, substituindo o método conflitante:
public class Clazz implements A, B {
public void foo(){}
}
Mas e se quisermos chamar a implementação padrão do método foo () da interface A em vez de implementar a nossa própria.
É possível se referir a A # foo () da seguinte maneira:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}