2010-06-07 65 views
19

有很多的人誰試圖創建仿製藥的這樣一個數組的計算器問題:爲什麼Java不允許創建通用數組?

ArrayList<Foo>[] poo = new ArrayList<Foo>[5]; 

當然,答案是,Java規範不允許你聲明數組仿製藥。

但是我的問題是爲什麼? Java語言或Java虛擬機中的這種限制的技術原因是什麼?這是我一直想知道的技術好奇心。

回答

13

數組已被通用 - 它們在運行時保留類型信息。

泛型是一個編譯時構造 - 類型信息在運行時丟失。這是一個慎重的決定,允許向前兼容Java字節碼的向後兼容性。結果是你不能創建一個泛型類型的數組,因爲在VM想創建數組時,它不知道使用哪種類型。

3

這是一個古老的博客文章我寫的,我解釋這個問題:Java generics quirks

How do I generically create objects and arrays?從安格朗格的Java泛型常見問題的解決方法,(你可以使用反射這樣做)。該FAQ包含了您想了解的有關Java泛型的所有信息。

+0

博客頁面由我的前僱主主辦,不再存在。 – Jesper 2014-06-26 09:24:07

0

你不得不使用

ArrayList<Foo>[] poo = new ArrayList[5]; 

,這將給你一個unchecked警告。原因是泛型和Java數組的運行時類型檢查行爲存在潛在的類型安全問題,並且他們希望在編程時確保知道這一點。當你編寫new ArrayList[...]時,你正在創建一些東西,它會在運行時檢查所有放入它的東西,以確保它是ArrayList的一個實例。按照這個方案,當你做new ArrayList<Foo>[...]時,那麼你期望創建一些東西,在運行時檢查所有放入它的東西,以確保它是一個ArrayList<Foo>的實例。但是這在運行時是不可能的,因爲在運行時沒有泛型信息。

相關問題