2014-01-14 43 views
5

在下面的例子中,import是必要的,否则Java的编译器会抱怨Nested不能在Iterable<Nested>解析为一个类型:为什么我必须在定义的类中导入嵌套类?

package test; 

import test.Example.Nested; 

public class Example implements Iterable<Nested> { 

    public final static class Nested {} 

} 

(使用Iterable<Example.Nested>,而不是进口的作品也一样)

这只有在外部类的定义中引用嵌套类时才会发生,例如当使用它作为参数类型时,而且在扩展/实现它时(编译器可以解析类时会导致另一个错误),或者在注释中使用它时。

我的问题是:为什么编译器无法在没有显式声明的情况下找到嵌套类?

回答

5

的声明是在它发生在范围可见的,并且为会员,该范围是包围大括号中的东西,或者作为spec所说:

的一个声明的范围成员m在类别C(§8.1.6)中声明或继承的是C的整个主体,包括任何嵌套类型声明。

为什么它被定义为只有Java的创建者才能以某种程度的确定性来回答,但我怀疑他们希望尽可能简单的规则,并且说所有成员,变量等等在周围花括号内是可见的是一个非常简单的规则。

顺便说一句:您不需要导入该类型,您可以改为使用限定名称。在你的榜样,会读:

public class Example implements Iterable<Example.Nested> { } 
1

嵌套类为<OuterClass>.<InnerClass>引用的,所以Iterable<Example.Nested>将在Java中做到这一点的典型方式,虽然使用import也是一种选择。

请参阅Java教程中的Nested Classes

+0

我觉得OP是有外部类应该能够访问它的嵌套类而不用'Outer.'前缀的问题。例如,你可以在'Example'类中声明'Nested'字段,而不必使用'Example.Nested'类型声明,但是你不能在'Iterable '中使用它。 – Pshemo

+1

@AmirPashazadeh:那么,OP不*使用import子句;遵循Outer.Inner公约将起作用,并且是典型的方式。但是如果他想要一个答案“为什么”,我能给出的最好的答案就是“这就是Java的工作方式”。 – Jimothy

+0

@AmirPashazadeh:如果您的异议是嵌套类链接,我提供它,因为它解释了如何引用嵌套类(Outer.Inner)等。 – Jimothy

1

下面的代码是没有“内部”类体

public class Example implements Iterable<Nested> 
{ 
    // class body starts here 

嵌套的refered给类以外的,所以你必须要么import或使用Example.Nested嵌套在范围内。

如果你把类似的代码的类体中,将工作:

{ 
     // class body starts here 

     public void foo(Iterable<Nested> x) ... 
} 

,因为你现在是一流的范围,其中嵌套定义和提供不合格内这只是正常

相关问题