类声明中的成员接口是否隐式公开?

Are*_*rff 10 java jls

我有以下类与成员接口:

package com.example.withinterface;

public class SomeClass {

    interface SomeInterface {

        void doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个类试图访问它:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误

在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.

两者都编译为Java 7.如果我创建SomeInterface,一切编译都很好public.

但规格说

Java 7Java语言规范说明了这一点:

成员接口是一个接口,其声明直接包含在另一个类或接口声明中.

除非指定了访问修饰符,否则类声明中的成员接口是隐式公共的(第6.6节).

对Java 5的Java语言规范似乎并不具备第二句.

所以SomeInterface不应该被认为是公共的,不应该主编译?

更新

正如Ajay George所说,这确实是Java语言规范7中的一个错误(感谢JamesB).与此同时,规范得到纠正,删除了错误的句子.Archive.org中的最新版本,句子不正确.

Aja*_*rge 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();
}
Run Code Online (Sandbox Code Playgroud)

我把接口改为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();
}
Run Code Online (Sandbox Code Playgroud)

请注意内部类中的差异。

  • 我同意。JLS显然是错误的。使用 Java 7 JDK,仅当成员接口**显式**声明为公共时,代码才会编译。 (2认同)