Java Language Méthode par défaut collision par héritage multiple


Exemple

Prenons l'exemple suivant:

public interface A {
    default void foo() { System.out.println("A.foo"); }
}

public interface B {
    default void foo() { System.out.println("B.foo"); }
}

Voici deux interfaces déclarant la méthode default foo avec la même signature.

Si vous essayez d' extend ces deux interfaces dans la nouvelle interface, vous devez en choisir deux, car Java vous oblige à résoudre cette collision explicitement.

Tout d'abord , vous pouvez déclarer la méthode foo avec la même signature que abstract , ce qui remplacera B comportements A et B

public interface ABExtendsAbstract extends A, B {
    @Override
    void foo();
}

Et lorsque vous allez implement ABExtendsAbstract dans la class vous devrez fournir une implémentation foo :

public class ABExtendsAbstractImpl implements ABExtendsAbstract {
    @Override
    public void foo() { System.out.println("ABImpl.foo"); }
}

Ou deuxièmement , vous pouvez fournir une implémentation default complètement nouvelle. Vous pouvez également réutiliser le code des méthodes foo A et B en accédant aux méthodes par défaut substituées à partir de la classe d'implémentation .

public interface ABExtends extends A, B {
    @Override
    default void foo() { System.out.println("ABExtends.foo"); }
}

Et lorsque vous implement ABExtends dans la class vous not devrez not fournir d'implémentation foo :

public class ABExtendsImpl implements ABExtends {}