这段代码在使用JDK版本1.6.0_33-b03-424的javac编译器时可以正常编译,但在使用JDK版本1.7.0_06的javac编译器时无法编译。
public class Test {
private final int i = 0;
void test(Object o) {
if (getClass().isInstance(o)) {
System.out.println(getClass().cast(o).i);
}
}
}
javac 的输出为:
Test.java:6: error: i in Test is defined in an inaccessible class or interface
System.out.println(getClass().cast(o).i);
^
1 error
将代码更改为在临时变量中存储getClass.cast()
的结果可以使程序编译通过。
虽然这很容易解决,但我找不到JLS 7中对此更改的任何理由,也没有在JDK 7发行说明中提到过这样的更改。虽然有一处提到了涉及通用类型参数的私有成员的访问更改,但这并不适用于这里。
这是javac中的一个退化吗? 它是否正在强制实施之前没有执行的限制?