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
我想知道爲什麼第一個和第三個聲明可以正常工作,但第二個聲明沒有。泛型類實例的三個聲明之間的區別
三者有什麼區別?
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
我想知道爲什麼第一個和第三個聲明可以正常工作,但第二個聲明沒有。泛型類實例的三個聲明之間的區別
三者有什麼區別?
第二行和第三行是創建通用數組的示例。第二個不是可確定。這意味着該類型在運行時不可用。
的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類型的數組類型,因爲它是通用的,它不是所有無界通配符。第三行是好的,因爲它的泛型都是無界的通配符。
第一行是可以的,因爲它不是數組。
'這意味着類型在運行時不可用.',爲什麼? –
另外,爲什麼在編譯時沒有報告錯誤? –
當Java引入泛型時,在1.5中,它需要向後兼容非泛型代碼。而不是像C++模板那樣爲每個使用的泛型類型創建不同的類型,Java使得它成爲嚴格的編譯時類型安全檢查。編譯成功後,編譯器執行_type erasure_,以便生成的字節碼不包含類型信息。 JVM不知道'iOb'是'Gen
https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays –
也注意到這是非法的 - 'Gen > iOb = new Gen >(50,n); ' – ZhongYu