據我瞭解,泛型是Java的編譯時功能,參數化類型信息不存在於編譯的字節碼中。我現在已經發現了Field#getGenericType和Method#getGenericReturnType方法,從而打破了我的世界觀。請幫我把它拼在一起。Java類型擦除與字段#getGenericType和方法#getGenericReturnType
8
A
回答
3
當您在IDE中處理一個編譯字節碼的jar時,仍然可以獲得通用的自動完成。這是如何實施的。基本上你是對的:類型沒有被完全擦除。
6
只刪除運行時類型的對象。例如:
Object obj = new ArrayList<String>();
obj.getClass()
將返回ArrayList.class
。你甚至可以說ArrayList
有一個通用參數。但是無法確定obj
是否被創建爲ArrayList<String>
,ArrayList<Integer>
,ArrayList<Object>
,ArrayList
(原始)或其他任何內容。
靜態類型信息仍然存在類,方法等(儘管不適用於本地人)。這只是額外的一點數據作爲屬性附加在類文件中,並且在運行時可用。想想它與具有運行時保留的註釋非常相似。有問題嗎?
2
字段和方法的靜態泛型類型信息必須存在於已編譯的類文件中,以便在編譯其他源代碼時,編譯器可以進行類型檢查。例如,當您編寫使用ArrayList<E>
類型變量的代碼並調用其上的get()
方法時,您沒有ArrayList
類的源代碼。編譯器會查看編譯後的類文件並獲取get()
方法的通用返回類型,並意識到它會返回通用類型E
,以便它可以進行類型檢查。因此,通用類型信息必須存在,以便編譯器可以檢查它。
相關問題
- 1. 困惑類型擦除和橋方法
- 2. Java類型擦除和重載?
- 3. 方法有相同類型的擦除
- 4. Scala宏和類型擦除
- 5. 類型擦除和集合
- 6. 類型擦除,通過類的說法
- 7. 在Java中使用類型擦除
- 8. Java類型擦除:投入規則?
- 9. Java泛型類型擦除字節代碼
- 10. 涉及的重載方法,類型限制使用和...類型擦除
- 11. Java泛型和考慮下面的代碼類型擦除
- 12. C++類型擦除與性狀
- 13. 如何自動刪除私有字段和方法的Java類
- 14. 如何使用嵌套枚舉與Java類型擦除
- 15. 泛型,擦除和字節代碼
- 16. 覆蓋使用類型擦除的方法
- 17. Scala類型安全和類型擦除相關問題
- 18. JpaRepository的泛型沒有類型擦除?
- 19. 什麼是Java泛型中的類型擦除?
- 20. Java泛型名稱衝突類型擦除
- 21. 類型擦除不工作在Java地圖類
- 22. 類型擦除 - 泛型 - 得到ClassCastException不在預期的地方
- 23. 不能像通用方法類型一樣使用Java通用字段類型?
- 24. 斯卡拉:案例類不適用與手動執行和類型擦除
- 25. 通用類型擦除警告
- 26. 類型擦除:我錯過了什麼?
- 27. Eclipse繼承的java方法和字段
- 28. 儘管Java的類型擦除獲得T.class
- 29. 在java中顯示類型擦除的結果
- 30. Java:類型橡皮擦實施