码
我有一个成员接口的类:
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中得到以下错误:SomeClass中SomeInterface不是public;不能从外部包装访问.
在Eclipse中:SomeInterface在SomeClass中不是public;不能从外部包装访问.
两者都编译为Java 7.如果我将SomeInterface公开,那么所有的编译都很好.
但规格说
Java Language Specification for Java 7说:
A member interface is an interface whose declaration is directly
enclosed in another class or interface declaration.A member interface in a class declaration is implicitly public (§6.6)
unless an access modifier is specified.
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.
解决方法
我猜这个规范是错的.
这是您的代码的javap输出.
这是您的代码的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(); }
注意内在类的差异.