【发布时间】:2013-03-30 18:50:57
【问题描述】:
我发现了一个奇怪的编译限制,我无法解释,我不明白这个限制的原因。
示例 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.Enumis defined in an inaccessible class or interface
示例 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());
然后可以编译并正常工作。
所以,问题是:
为什么需要这种可访问性限制?
是的,我知道 example-1) 中的类 C1.E 和 example-2) 中的 C1.I2 是包私有的。 但同时很明显,没有人可以分配较弱的访问权限基接口方法的特权(Object 中的I1),因此将对象直接转换为其基接口并访问受限方法总是安全的。
有人能解释一下这个限制的目的和原因吗?
引用(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数只有在类型可访问时才可访问...
看起来这是限制,但它没有解释为什么需要这个限制(在上述示例的情况下)......
【问题讨论】:
-
把
enum E1 { A, B, C }写成public enum E1 { A, B, C } -
@Andremoniy 答案在#6.6.1 我相信:引用(类、接口或数组)类型或构造函数的成员(类、接口、字段或方法)只有类型可访问并且声明成员或构造函数允许访问,才能访问类类型。
-
@BheshGurung 我知道,我在问:为什么我们需要这种可访问性限制?
-
@assylias #6.6.1 看起来就像那个限制,但它并没有解释这个愚蠢和不必要的限制。是吗?
-
@Andremoniy 不幸的是,根本原因很可能隐藏在编写/决定的人的脑海中(或者他们只是没有想到那个特定的用例)......
标签: java compiler-errors