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

时间:2012-07-24 20:13:57

标签: java jls

代码

我有以下带有成员接口的类:

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

两者都编译为Java 7.如果我创建SomeInterface public,那么编译得很好。

但规范

Java Language Specification for Java 7说:

  

成员接口是直接声明的接口   包含在另一个类或接口声明中。

     

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

Java Language Specification for Java 5似乎没有第二句话。

问题

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

更新

根据Ajay George的建议,这确实是an error in the Java Language Specification 7(感谢JamesB)。与此同时,规范得到纠正,删除了错误的句子。 Last version in Archive.org with the incorrect sentence

1 个答案:

答案 0 :(得分: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();
}

注意内部类的差异。