【发布时间】:2012-07-24 20:13:57
【问题描述】:
代码
我有以下带有成员接口的类:
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 不应该被认为是公开的,不应该 Main 编译吗?
更新
正如Ajay George 所建议的,这确实是an error in the Java Language Specification 7(感谢JamesB)。与此同时,规范被纠正,不正确的句子被删除。 Last version in Archive.org with the incorrect sentence.
【问题讨论】:
-
嗯。除非另有说明,否则我一直认为所有东西都受到包装保护。我想我学到了一些新东西。
-
我认为这是因为没有访问修饰符的成员具有包访问权限。所以它们不能被其他包使用
-
@Desolator 你读过这个问题吗?成员接口默认是公开的。
-
我的问题是,到底是什么让他们引入了这种变化?现在不再有包级成员接口。
-
@MarkoTopolnik 你的意思是我们不能做像
protected interface Foo这样的事情?还是我假设它会做想要的事情是错误的?