2011-11-29 50 views
4

我想知道爲什麼會是一個問題,如果Java有泛型沒有刪除。我知道這個問題是與舊庫兼容的問題,但是如果把Object放在我們不指定的類型的地方,那就不行了。例如,我們可以使用List list = new ArrayList();作爲List<Object> -s集合,List<Integer> list = new ArrayList<Integer>();將按原樣不刪除。泛型刪除

有人可以舉個例子,如果擦除不起作用會發生什麼。

+0

我不確定您瞭解什麼類型的刪除是... –

+0

您的問題不清楚。此外,您似乎將原始類型與特定類型混淆。 – helpermethod

回答

3

這仍然要求這些舊庫在重新編譯之前,可以在新的JVM上使用 - 這正是Java設計人員不惜一切代價一直避免的重大改變。

+0

當然,新的Java代碼不能在舊的JVM上運行,但這意味着舊的代碼無法在新的VM上運行? – George

+0

@George:這就是我說的,是的。 –

+0

是的,我知道新的不會老。很明顯,1.5版本的jvms和編譯器不知道泛型,但它與庫有什麼關係。這是「Thinking in Java」的引用。 沒有某種遷移路徑,隨着時間的推移,所有已建立的庫存機會被選擇遷移到Java泛型的開發人員截斷。 – George

3

爲了解Java的泛型和特別的類型擦除,您可以找到的最好的資源之一是Angelika Langer的FAQ關於該主題的內容,請看看它,所有內容都將清晰明瞭。

0

這不是簡單的向後兼容性問題,而是migration compatibility。正如您正確地指出的那樣,1.5之前的每個列表實際上都是List<Object>,因此定義List := List<Object>本可以工作,並且已經向後兼容。但是,將現有庫遷移到1.5並將隱含的List<Object>轉換爲List<Foo>會破壞客戶端代碼。輸入原始類型..