コード
メンバーインターフェイスを持つ次のクラスがあります。
package com.example.withinterface;
public class SomeClass {
interface SomeInterface {
void doSomething();
}
}
そしてそれにアクセスしようとしている別のクラス:
package com.example.withinterface.main;
import com.example.withinterface.SomeClass;
public class Main {
public static void main(String[] argss) {
System.out.println(SomeClass.SomeInterface.class);
}
}
エラー
Mainでは、javacから次のエラーが発生しますSomeInterface is not public in SomeClass; cannot be accessed from outside package
。
そしてEclipseでは:SomeInterface is not public in SomeClass; cannot be accessed from outside package
。
どちらもJava7としてコンパイルします。SomeInterfaceを作成すると、すべてが正常にコンパイルされますpublic
。
しかしスペックは言う
Java 7のJava言語仕様では、次のように述べています。
メンバーインターフェイスは、宣言が別のクラスまたはインターフェイス宣言に直接含まれているインターフェイスです。
アクセス修飾子が指定されていない限り、クラス宣言のメンバーインターフェイスは暗黙的にパブリック(§6.6)です。
Java5のJava言語仕様には2番目の文がないようです。
質問
では、SomeInterfaceはパブリックと見なされるべきではなく、メインコンパイルされるべきではありませんか?
アップデート
Ajay Georgeが示唆したように、これは確かにJava言語仕様7のエラーでした( JamesBに感謝)。その間に、仕様が修正され、誤った文が削除されました。間違った文のArchive.orgの最後のバージョン。