2014-01-14 42 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) ... 
} 

,因爲你現在是一流的範圍,其中嵌套定義和提供不合格內這只是正常

相關問題