42 votes

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

Considérons ci-dessous hiérarchie de 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(String[] args) {
        ClassB b = new ClassB();
        b.hello();
    }
}

Exécute le programme donnera l'erreur suivante :

Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.testing.ClassA.hello()V from class com.testing.Test
at com.testing.Test.main(Test.java:23)
  1. Tout cela parce que j'ai marqué ClassA.bonjour comme privé.
  2. Si je marque ClassA.bonjour protégées ou supprimer le modificateur de visibilité(c'est à dire en le rendant étendue par défaut), puis il montre une erreur de compilation, comme : The inherited method ClassA.hello() cannot hide the public abstract method in Myinterface

Toutefois, par exception stacktrace ci-dessus, je reçois un runtime IllegalAccessError.

Je ne pouvais pas comprendre pourquoi ce n'est pas détectée au moment de la compilation. Des indices ?

31voto

Oleksandr Points 7545

Mise à jour: on dirait que c'est vraiment un bug.

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

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

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

Jusqu'à l'exécution, car au moment de l'exécution hello(...) méthode de l' 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 valeur par défaut hello(...) méthode de l'interface, vous obtenez le même accès illégal d'erreur, mais maintenant, au moment de la compilation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X