このコードは、javac JDK バージョン 1.6.0_33-b03-424 を使用すると正常にコンパイルされますが、javac JDK バージョン 1.7.0_06 を使用するとコンパイルされません。
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の回帰ですか? 以前は施行されていなかった制限が現在施行されていますか?