gpt4 book ai didi

java - 类声明中的成员接口(interface)是否隐式公开?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:01:49 32 4
gpt4 key购买 nike

代码

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

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 在 SomeClass 中不公开;无法从外部包访问

在 Eclipse 中:SomeInterface 在 SomeClass 中不公开;无法从外部包访问

两者都编译为 Java 7。如果我将 SomeInterface 设置为 public,一切都可以正常编译。

但是 Spec 说

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 不应该被认为是公开的并且 Main 不应该被编译吗?

更新

根据 Ajay George 的建议这确实是 an error in the Java Language Specification 7 (感谢 JamesB)。同时,更正了规范并删除了不正确的句子。 Last version in Archive.org with the incorrect sentence .

最佳答案

我猜规范有误。这是您的代码的 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();
}

我把接口(interface)改为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();
}

注意内部类的区别。

关于java - 类声明中的成员接口(interface)是否隐式公开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11638627/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com