与私有方法冲突时在接口中调用默认方法
2022-09-01 02:12:35
考虑下面的类层次结构。
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();
}
}
运行该程序将给出以下错误:
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)
- 这都是因为我将ClassA.hello标记为私有。
- 如果我将ClassA.hello标记为受保护或删除可见性修饰符(即使其成为默认范围),则它会将编译器错误显示为:
The inherited method ClassA.hello() cannot hide the public abstract method in Myinterface
但是,根据上面的异常堆栈跟踪,我得到了一个运行时 IllegalAccessError。
我不明白为什么在编译时没有检测到这一点。任何线索?