2009-09-25 103 views

回答

5

Java泛型由Java編譯器處理,並在編譯時轉換爲非泛型版本。這與CLR對類型參數具有一流支持的.NET不同。在字節碼級別,ArrayList<T>只是一個簡單的ArrayList

引述Java docs

泛型由Java編譯器作爲被叫擦除前端的轉換,這是轉換或重寫使用泛型成非通用碼碼的過程(實施即將新語法映射到當前的JVM規範)。換句話說,這種轉換會擦除所有通用類型信息;尖括號之間的所有信息都將被刪除。例如,LinkedList<Integer>將變爲LinkedList。其他類型變量的使用由類型變量的上限(例如,Object)取代,並且當生成的代碼類型不正確時,將插入到適當類型的轉換。

+4

我不喜歡Java泛型出於這個原因。泛型應該是一個主要特徵,但它不過是爲了避免將'object's鑄造成特定類型的語法糖而已。糖是美好的,但它可能更多。笨蛋類型,所以確實增加了價值,所以它並不全是壞的。 – Joren 2009-09-25 12:45:18

+1

@Joren,你對泛型不必要地苛刻。雖然類型擦除當然是令人失望的,但泛型確實是必須從Object強制轉換的明顯進步,因爲我們現在可以通過泛型類獲得Java類型系統的所有編譯時保證。 – Falaina 2009-09-26 11:56:21

+3

但是通用信息在編譯的類文件中仍然可用作元數據(否則'javac'將無法檢查泛型)。 IKVM不能使用這些信息嗎? – 2013-01-15 21:44:39