尝试从类中导入嵌套类型

时间:2013-08-05 22:04:54

标签: java

我无法弄清楚为什么这不起作用。我的顶级课程是未命名的课程(暂时;我打算稍后设置课程)。

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中使用的类型的规范名称。我做错了什么?

(P.S。我现在认为import static本来会更好,但它也不起作用。)

3 个答案:

答案 0 :(得分:9)

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

因为JLS §7.5告诉你不要:

  

未命名包中的类型(第7.4.2节)没有规范名称,所以   在每种进口申报中要求规范名称   意味着(a)无法导入未命名包中的类型,并且   (b)无法导入未命名包中类型的静态成员。   因此,§7.5.1,§7.5.2,§7.5.3和§7.5.4都需要编译时   任何尝试导入类型(或其静态成员)的错误   未命名的包裹。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:-3)

如果您要进行导入,那么您可以将Iclass2中的私人成员声明为private Nested1 someMember;,而无需Iclass1.Nested1,您必须在包中拥有Iclass1。< / p>

将它放入包中后,您可以像这样导入嵌套成员:

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

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