Java言語仕様 第3版にて
class C { void mCDefault() {} public void mCPublic() {} private void mCPrivate() {} protected void mCProtected() {} } abstract class CT extends C implements I {} interface I { void mI(); } class D { <T extends C & I> void test(T t) { t.mI(); // 1. t.mCDefault(); // 2. t.mCPublic(); // 3. t.mCPrivate(); // 4. t.mCProtected(); // 5. } }
これをコンパイルするとどうなるか?
結果は,件の本によると4.のmCPrivate以外はOKと書いてある.また,mCDefaultに関しては以下のような説明もある.
CがTとは別のパッケージ内で宣言されている場合,Tが宣言された場所からmCDefaultにアクセスできなくなるため,mCDefaultへの呼び出しによってコンパイル時のエラーが引き起こされる.
ふむふむと思い手元の環境で試してみた.
だが,手元の環境ではjdk1.6.0とjdk1.6.0_01だとその通りなのだが,jdk1.6.0_02だと2.mCDefaultもコンパイルエラーとなる.
$ java -version java version "1.6.0_02" Java(TM) SE Runtime Environment (build 1.6.0_02-b06) Java HotSpot(TM) Client VM (build 1.6.0_02-b06, mixed mode, sharing) $ javac C.java C.java:16: シンボルを見つけられません。 シンボル: メソッド mCDefault() t.mCDefault(); ^ C.java:18: シンボルを見つけられません。 シンボル: メソッド mCPrivate() t.mCPrivate(); ^ エラー 2 個
これってバグ?