10

コード

メンバーインターフェイスを持つ次のクラスがあります。

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の最後のバージョン

4

1 に答える 1

2

スペックが間違っていると思います。これがあなたのコードでのjavap出力です。

E:\workspace>javap com\example\withinterface\SomeClass
Warning: Binary file com\example\withinterface\SomeClass contains com.example.wi
thinterface.SomeClass
Compiled from "SomeClass.java"
public class com.example.withinterface.SomeClass {
  public com.example.withinterface.SomeClass();
}

E:\workspace>javap com\example\withinterface\SomeClass$SomeInterface
Warning: Binary file com\example\withinterface\SomeClass$SomeInterface contains
com.example.withinterface.SomeClass$SomeInterface
Compiled from "SomeClass.java"
interface com.example.withinterface.SomeClass$SomeInterface {
  public abstract void doSomething();
}

インターフェイスをpublicに変更してから、再コンパイルしました。

E:\workspace>javap com\example\withinterface\SomeClass
Warning: Binary file com\example\withinterface\SomeClass contains com.example.wi
thinterface.SomeClass
Compiled from "SomeClass.java"
public class com.example.withinterface.SomeClass {
  public com.example.withinterface.SomeClass();
}

E:\workspace>javap com\example\withinterface\SomeClass$SomeInterface
Warning: Binary file com\example\withinterface\SomeClass$SomeInterface contains
com.example.withinterface.SomeClass$SomeInterface
Compiled from "SomeClass.java"
public interface com.example.withinterface.SomeClass$SomeInterface {
  public abstract void doSomething();
}

Innerクラスの違いに注意してください。

于 2012-07-24T20:44:06.230 に答える