2009-05-28 85 views

回答

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,以便它可以進行類型檢查。因此,通用類型信息必須存在,以便編譯器可以檢查它。