我的理解是,C#和java在某些方面與泛型有所不同,其中之一是通用類型參數在運行時在C#/ .NET中可用,但在Java中不可用。爲什麼Java語言設計人員這樣做?爲什麼不在運行時指定Java通用類型參數?
5
A
回答
9
爲了允許與預先通用字節碼的二進制兼容性,因此允許新代碼與舊代碼接口。
從Type Erasure頁面的Java教程:
類型擦除能夠使用仿製藥,以保持與之前被仿製藥 創建Java庫和 應用程序的二進制兼容性 Java應用程序 。
[...]
類型擦除的存在使得新代碼 可以繼續遺留 代碼交互。
對於相關問題,請看C# vs Java generics。
4
我記得讀一些有關這本書的Java性交:
與檢查 元素在運行時收集的是,它是 極其昂貴的問題; 的效率僅爲O(n)。如果您有 只有10個地址在您的收藏中, 檢查元素很容易。但是,如果 集合包含15,000個 地址,那麼只要有人調用setter,就會產生一個顯着開銷 。
在另一方面,如果你 可以防止用戶在編譯的時候把不是地址等 任何在你 集合,然後你 就不必在 運行時檢查類型。如果他們試圖給你 不是地址的東西,那麼 編譯器會拒絕這個嘗試。 這正是參數化 類型所做的。
但是,「爲什麼」的問題永遠不能真正得到滿意的回答,因爲涉及人,時間,地點和政治的變量太多了。我記得在其他地方讀到,這個決定與保持與Java字節碼中已經完成的方式的兼容性有很大的關係。下面是同一本書中的另一個引用:
編譯器解決了泛型引入的類型安全性後,它從類型中刪除了參數化。因此,信息在運行時不可用。如Sun所述,刪除的目的是允許使用較舊版本的JDK構建的類庫能夠在JDK 1.5虛擬機上運行。
我很好奇,運行時泛型提供了哪些優點?
相關問題
- 1. 在運行時指定通用委託類型參數
- 2. 在運行時指定通用集合類型參數(Java反射)
- 3. 爲什麼我不需要在C#中指定類型參數?
- 4. 通過類型參數在運行時
- 5. 在運行時確定通用方法參數的類型
- 6. 什麼時候我們不能指定類型參數
- 7. Java通用方法在運行時轉換爲參數類型,有可能嗎?
- 8. 爲什麼在web api中指定路由參數類型?
- 9. 在運行時設置通用類的類型和參數
- 10. 運行時類型參數
- 11. 在運行時指定對象類型
- 12. 爲什麼我需要爲靜態lib構建指定運行時庫類型?
- 13. 爲什麼這種Java方法通過聲明類型而不是運行時類型進行變形?
- 14. 爲什麼通用方法不能推斷參數類型?
- 15. 爲什麼調用指令會導致運行時不穩定?
- 16. 在非通用類在運行時確定泛型類型
- 17. 運行時通用類型確定
- 18. 如何爲函數參數指定通用類型
- 19. 爲什麼這種類型不允許使用類型參數?
- 20. 爲什麼我不能指定類型參數的構造函數限制:new()
- 21. C# - 在泛型方法使用運行時定義的類型作爲參數
- 22. 爲什麼Java不允許基於類型參數的重載?
- 23. 爲什麼不能模板非類型參數是類類型
- 24. 爲什麼忽略參數類型時泛型完全禁用?
- 25. 使用在運行時確定的類型參數調用泛型函數
- 26. 在運行時創建的類型參數的泛型類型
- 27. 爲什麼在推斷數組類型時java類型不安全?
- 28. 未指定類型參數
- 29. 爲什麼不是運算符類型在java中安全的?
- 30. 爲什麼我必須指定所有的泛型類型參數?