Chamando o método padrão na interface ao entrar em conflito com o método privado
Considere abaixo a hierarquia de classes.
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();
}
}
A execução do programa dará o seguinte erro:
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)
Isso é tudo porque eu marquei ClassA.hello como particular.Se eu marcar ClassA.hello como protegido ou remover o modificador de visibilidade (ou seja, torná-lo escopo padrão), ele mostrará um erro do compilador como:The inherited method ClassA.hello() cannot hide the public abstract method in Myinterface
No entanto, conforme o rastreamento de pilha de exceção acima,Eu recebo um IllegalAccessError em tempo de execução.
Não consegui entender por que isso não é detectado no momento da compilação. Alguma pista?