我发现了一个奇怪的编译限制,我无法解释,我不明白这个限制的原因。
示例 1:
考虑这些类:
在package e1;
:
public class C1 {
enum E1 { A, B, C }
public E1 x;
}
在package e2;
:
import e1.C1;
public class C2 {
public String test(C1 c1) {
return c1.x.toString(); // here compilation error
}
}
这会导致以下编译错误:
错误:(5,20)java:
toString()
injava.lang.Enum
被定义在一个不可访问的类或接口中
示例 2:
考虑这些类:
在package i1;
:
public interface I1 {
int someMethod();
}
public class C1 {
static class I2 implements I1 {
public int someMethod() {
return 1;
}
}
public I2 x = new I2();
}
在package i2;
:
import i1.C1;
import i1.I1;
public class C2 {
public static void main(String[] args) {
C1 c1 = new C1();
System.out.println(c1.x.someMethod()); // compilation error
}
}
这也会导致相同的编译错误,但如果我们将违规行更改为:
System.out.println(((I1)c1.x).someMethod());
然后可以编译并正常工作。
所以,问题是:
为什么需要这种可访问性限制?
是的,我知道C1.E
example-1) 和C1.I2
example-2) 中的类是包私有的。但同时很明显,没有人可以为基接口(I1
of Object
)的方法分配较弱的访问权限,因此将对象直接转换为其基接口并获得对受限方法的访问总是安全的。
有人可以解释这种限制的目的和原因吗?
引用(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问时才可访问...
看起来这是限制,但它没有解释为什么需要这个限制(在上述示例的情况下)......