考虑下面的代码。
interface I {
default Number f() {
return 0;
}
}
class A {
private Number f() { // if Number is replaced with other type, all will work fine
return 1;
}
}
class B extends A implements I {
}
class Main {
public static void main(String[] args) {
System.out.println(new B().f());
}
}
这个程序产生一个 IllegalAccessError
.
Exception in thread "main" java.lang.IllegalAccessError: class tasks.a1.Main tried to access private method 'java.lang.Number tasks.a1.A.f()' (tasks.a1.Main and tasks.a1.A are in unnamed module of loader 'app')
at tasks.a1.Main.main(Sub.java:20)
但是如果你替换 A.f()
与 Integer
或者 Object
,则不会发生错误,将执行默认方法。
为什么在上面的代码片段中 IllegalAccessError
发生,但在所描述的修改后,所有工作正常吗?
问题调用接口中的默认方法与私有方法冲突时,两个方法的返回类型相同(即, void
),但我想知道为什么在使返回类型不同之后错误消失了。
暂无答案!
目前还没有任何答案,快来回答吧!