码
我有以下类与成员接口:
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.
但规格说
成员接口是一个接口,其声明直接包含在另一个类或接口声明中.
除非指定了访问修饰符,否则类声明中的成员接口是隐式公共的(第6.6节).
在对Java 5的Java语言规范似乎并不具备第二句.
题
所以SomeInterface不应该被认为是公共的,不应该主编译?
更新
正如Ajay George所说,这确实是Java语言规范7中的一个错误(感谢JamesB).与此同时,规范得到纠正,删除了错误的句子.Archive.org中的最新版本,句子不正确.
我猜规格是错误的。这是您的代码的 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)
请注意内部类中的差异。
| 归档时间: |
|
| 查看次数: |
534 次 |
| 最近记录: |