2010-12-16 54 views
2

我只是關於泛型的一般性問題。我已經使用了它們多年,並且聽說它們不完美,因爲它們在編譯時被剝離(正確?)。我很難找到導致它們失敗的特定代碼的例子或解釋。任何人都可以給出一個代碼示例和/或解釋?當泛型失敗時,我可以得到一個例子嗎?

+1

你要找的術語叫做【類型】(http://download.oracle.com/javase/tutorial/java/generics/erasure.html)[刪除](HTTP:/ /en.wikipedia.org/wiki/Generics_in_Java#Type_erasure)。但是,我沒有看到這方面的實際問題。你是什​​麼意思_「導致[泛型]失敗?」_ – 2010-12-16 17:14:48

+0

@Matt我認爲他正在尋找一個類型擦除導致問題/錯誤的例子。 – Poindexter 2010-12-16 17:16:13

+0

是的,我仍然在尋找一個具體的例子,編譯器不會阻止我將錯誤的類型添加到集合中。有人可以舉一個這樣的例子嗎? – smuggledPancakes 2010-12-16 17:39:20

回答

1

這件事很簡單。在Java中,泛型是作爲編譯器功能實現的,而不是字節碼功能。

所以,當編譯器發現這樣的事情:

public List<String> getStrings() { 
    return new ArrayList<String>(); 
} 

它轉換成字節碼的代碼,不知道什麼泛型。

因此,您缺乏的是當您對具有該方法的類進行反思時推斷通用信息的能力。

另一方面,在.NET框架中,語言(C#)和運行時知道關於泛型。

1

此代碼將例如會由於擦除:在運行時

if (someList instanceof List<String>) 
    someList.add(myString); 

instanceof表達式進行求值,在該點的someList類型參數不再可用。

5

您所指的是Type Erasure,其中編譯器刪除類或參數中與類型參數和類型參數相關的所有信息。這可能是一個不利的例子是:

ArrayList<String> stringList = new ArrayList<String>(); 
ArrayList<Integer> integerList = new ArrayList<Integer>(); 

System.out.println(stringList.getClass(). 
    isAssignableFrom(integerList.getClass())); 

我們希望這會打印錯誤,但它實際上打印真實。 stringListintegerList之間沒有等級差別。

-1

什麼情況下你看到泛型會失敗(在運行時我假設)? 我不確定泛型對象是否有機會失敗 - 我的第一個猜測是,這將被編譯器捕獲,因此告訴您存在類型不匹配或任何類型,因爲泛型確保類型安全。

http://msdn.microsoft.com/en-us/library/ms172192.aspx

+1

這是Java。不是.Net。您的鏈接文章不適用 – 2010-12-16 17:22:14

相關問題