10

我不明白为什么这不起作用。我的顶级课程在未命名的包中(目前;我计划稍后设置包)。

Iclass1.java:

public class Iclass1 {    
    public static class Nested1 {
        // whatever
    }    
}

Iclass2.java:

import Iclass1.*;
public class Iclass2 {
    private Nested1 someMember;
    // etc.
}

我编译后Iclass1.java没有错误后,编译器在我编译时抱怨Iclass2.java:“错误:包 Iclass1 不存在”。

但是 JLS 说:(7.5.2)

import PackageOrTypeName . * ;

PackageOrTypeName 必须是包、类类型、接口类型、枚举类型或注释类型的规范名称(第 6.7 节)。

和: (6.7)

在未命名包中声明的顶级类或顶级接口的完全限定名称是类或接口的简单名称。

对于每个原始类型、命名包、顶级类和顶级接口,规范名称与完全限定名称相同。

所以看起来 Iclass1 是我试图在import. 我究竟做错了什么?

(PS我现在认为import static会更好,但它也不起作用。)

4

3 回答 3

8

由于您没有包,请不要使用导入。

因为 JLS §7.5告诉您不要:

未命名包中的类型(第 7.4.2 节)没有规范名称,因此每种导入声明中对规范名称的要求意味着(a)无法导入未命名包中的类型,以及(b)静态成员无法导入未命名包中的类型。因此,第 7.5.1 节、第 7.5.2 节、第 7.5.3 节和第 7.5.4 节都要求在尝试将类型(或其静态成员)导入未命名包中时出现编译时错误。

于 2013-08-05T22:08:18.593 回答
2

与java非常不一致,但是如果顶级容器类在默认包中,则似乎无法导入内部类。

如果将这两个类放在任何包中,导入工作正常。

尝试为这两个名为 的类创建一个目录foo,将它们移动到那里,然后 package foo;作为每个文件的第一行添加。

于 2013-08-05T22:15:28.450 回答
-3

如果要进行导入,则可以在Iclass2as中声明私有成员private Nested1 someMember;,而无需这样做,Iclass1.Nested1您必须Iclass1在包中。

一旦你把它放在一个包中,你可以像这样导入嵌套成员:

import mypackage.Iclass1.Nested1;
import mypackage.Iclass1.*;
import static mypackage.Iclass1.Nested1;
import static mypackage.Iclass1.*;

您不能从默认命名空间/包中导入任何内容。

于 2013-08-05T22:11:32.650 回答