2015-07-02 100 views
0
Gen <Integer> iOb = new Gen <> (50, n); //Works good 

Gen <Integer> gens[] = new Gen <> [10]; //Error 

Gen <?> gen[] = new Gen <?> [10];   //Alternative way for the second form 

我想知道爲什麼第一個和第三個聲明可以正常工作,但第二個聲明沒有。泛型類實例的三個聲明之間的區別

三者有什麼區別?

+0

https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays –

+0

也注意到這是非法的 - 'Gen iOb = new Gen (50,n); ' – ZhongYu

回答

2

第二行和第三行是創建通用數組的示例。第二個不是可確定。這意味着該類型在運行時不可用。

JLS, Section 15.10,佔地面積陣列創建:

它是一個編譯時間錯誤,如果ClassOrInterfaceType不表示reifiable類型(§4.7)。

Section 4.7限定reifiable類型:

A型是reifiable當且僅當如下條件之一成立:

  • 它指的是一個非通用類或接口類型宣言。

  • 這是一個參數化類型,其中所有類型參數都是無界通配符(§4.5.1)。

  • 它是一種原始類型(§4.8)。

  • 它是一種原始類型(§4.2)。

  • 它是一個數組類型(§10.1),其元素類型是可調整的。

  • 它是一個嵌套類型,其中對於由「。」分隔的每個類型T,T本身是可賦值的。

因此,第二行是不允許的,因爲它是不是一個reifiable類型的數組類型,因爲它是通用的,它不是所有無界通配符。第三行是好的,因爲它的泛型都是無界的通配符。

第一行是可以的,因爲它不是數組。

+0

'這意味着類型在運行時不可用.',爲什麼? –

+0

另外,爲什麼在編譯時沒有報告錯誤? –

+0

當Java引入泛型時,在1.5中,它需要向後兼容非泛型代碼。而不是像C++模板那樣爲每個使用的泛型類型創建不同的類型,Java使得它成爲嚴格的編譯時類型安全檢查。編譯成功後,編譯器執行_type erasure_,以便生成的字節碼不包含類型信息。 JVM不知道'iOb'是'Gen ',它只知道它是'Gen'。 – rgettman

相關問題