Appel de la méthode par défaut dans l’interface en cas de conflit avec une méthode privée

Considérez la hiérarchie sous la classe.

class ClassA { private void hello() { System.out.println("Hello from A"); } } interface Myinterface { default void hello() { System.out.println("Hello from Interface"); } } class ClassB extends ClassA implements Myinterface { } public class Test { public static void main(Ssortingng[] args) { ClassB b = new ClassB(); b.hello(); } } 

L’exécution du programme donnera l’erreur suivante:

 Exception in thread "main" java.lang.IllegalAccessError: sortinged to access method com.testing.ClassA.hello()V from class com.testing.Test at com.testing.Test.main(Test.java:23) 
  1. C’est tout parce que j’ai marqué ClassA.hello comme privé.
  2. Si je marque ClassA.hello comme protégé ou que je supprime le modificateur de visibilité (c.-à-d. En définissant l’étendue par défaut), une erreur de compilation apparaît alors: The inherited method ClassA.hello() cannot hide the public abstract method in Myinterface

Cependant, à l’exception de stacktrace ci-dessus, j’obtiens un runtime IllegalAccessError.

Je n’ai pas compris pourquoi cela n’est pas détecté à la compilation. Des indices?

    Mise à jour: On dirait que c’est vraiment un bug .

    Une déclaration de méthode de classe ou de super-classe est toujours prioritaire sur une méthode par défaut!

    default hello(...) méthode default hello(...) de Myinterface vous permet d’écrire sans erreurs:

     ClassB b = new ClassB(); b.hello(); 

    Jusqu’à l’exécution, car à l’exécution, la méthode hello(...) de ClassA prend la priorité la plus élevée (mais la méthode est privée). Par conséquent, IllegalAccessError se produit.

    Si vous supprimez la méthode hello(...) par défaut de l’interface, vous obtenez la même erreur d’access illicite, mais maintenant à la compilation.