我只是關於泛型的一般性問題。我已經使用了它們多年,並且聽說它們不完美,因爲它們在編譯時被剝離(正確?)。我很難找到導致它們失敗的特定代碼的例子或解釋。任何人都可以給出一個代碼示例和/或解釋?當泛型失敗時,我可以得到一個例子嗎?
2
A
回答
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()));
我們希望這會打印錯誤,但它實際上打印真實。 stringList
和integerList
之間沒有等級差別。
-1
什麼情況下你看到泛型會失敗(在運行時我假設)? 我不確定泛型對象是否有機會失敗 - 我的第一個猜測是,這將被編譯器捕獲,因此告訴您存在類型不匹配或任何類型,因爲泛型確保類型安全。
+1
這是Java。不是.Net。您的鏈接文章不適用 – 2010-12-16 17:22:14
相關問題
- 1. 我可以得到一個對象的泛型類型嗎?
- 2. 有人可以幫我理解這個例子的泛型嗎?
- 3. dafny可以顯示一個失敗斷言的反例嗎?
- 4. 如果子查詢失敗,可以讓MySQL成功嗎?如果子查詢成功,我可以失敗嗎?
- 5. 我可以舉個例子嗎?
- 6. 泛型可以避免我傳回一個通用的'Object'嗎?
- 7. 我們可以創建一個泛型類的數組嗎?
- 8. 泛型 - 我可以寫一個基於變量的T嗎?
- 9. 我可以從_pre_put_hook導致失敗嗎?
- 10. 我可以爲一個類的方法定義一個泛型typescript接口嗎?
- 11. 鑄造到泛型失敗在c#
- 12. Groovy的泛型失敗
- 13. 我在哪裏可以找到在C#中使用泛型的好例子?
- 14. 我可以傳遞一個非泛型類型,其中泛型類型是預期的嗎?
- 15. 可以給我一個xsl模板的「模式」的例子嗎?
- 16. 我可以將泛型方法限制爲多個接口嗎?
- 17. 我可以做這個泛型的東西嗎?
- 18. 任何方式來創建一個泛型列表,我可以添加一個類型和一個子類型?
- 19. 我可以得到一個子查詢返回多個記錄嗎?
- 20. 我可以定義一個可以採用多種可能值類型的泛型嗎? (VB.NET)
- 21. 我可以指定一個類實例可以轉換爲某種類型嗎?
- 22. C#泛型當T可以是一個數組
- 23. flowtype:$在泛型類型中使用時的子類型和typeof失敗
- 24. 我們可以推斷泛型輸出類型嗎?
- 25. 我可以將類型對象傳遞給泛型方法嗎?
- 26. 我可以訪問泛型編程的變量類型嗎?
- 27. 我可以從泛型類繼承而不指定類型嗎?
- 28. 當我爲一個應用程序都顯示得分失敗
- 29. 投泛型類型的失敗
- 30. 你可以聲明一個可變長度的泛型類型聲明嗎?
你要找的術語叫做【類型】(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
@Matt我認爲他正在尋找一個類型擦除導致問題/錯誤的例子。 – Poindexter 2010-12-16 17:16:13
是的,我仍然在尋找一個具體的例子,編譯器不會阻止我將錯誤的類型添加到集合中。有人可以舉一個這樣的例子嗎? – smuggledPancakes 2010-12-16 17:39:20