10

代码

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

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 7的Java 语言规范是这样说的:

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

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

Java 5的Java 语言规范似乎没有第二句话。

问题

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

更新

正如Ajay George所建议的,这确实是 Java 语言规范 7 中的一个错误(感谢JamesB)。与此同时,规范被纠正,不正确的句子被删除。Archive.org 中的最后一个版本,带有不正确的句子

4

1 回答 1

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();
}

注意 Inner 类的区别。

于 2012-07-24T20:44:06.230 回答