De https://dzone.com/articles/interface-default-methods-java
Java 8 introduit une nouvelle fonctionnalité «Méthode par défaut» ou (Méthodes Defender), qui permet au développeur d'ajouter de nouvelles méthodes aux interfaces sans interrompre l'implémentation existante de ces interfaces. Il offre une flexibilité pour permettre à l'interface de définir une implémentation qui sera utilisée par défaut dans la situation où une classe concrète ne parvient pas à fournir une implémentation pour cette méthode.
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
Il y a une question courante que les gens posent sur les méthodes par défaut lorsqu'ils entendent parler de la nouvelle fonctionnalité pour la première fois:
Que faire si la classe implémente deux interfaces et que ces deux interfaces définissent une méthode par défaut avec la même signature?
Exemple pour illustrer cette situation:
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 {
}
Ce code ne parvient pas à se compiler avec le résultat suivant:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Pour résoudre ce problème, dans Clazz, nous devons le résoudre manuellement en remplaçant la méthode en conflit:
public class Clazz implements A, B {
public void foo(){}
}
Mais que se passe-t-il si nous voulons appeler l'implémentation par défaut de la méthode foo () depuis l'interface A au lieu d'implémenter la nôtre.
Il est possible de faire référence à A # foo () comme suit:
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}