代码
我有以下带有成员接口的类:
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
答案 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();
}
注意内部类的差异。