2011-01-20 118 views
4

我正在學習Java中的泛型。 我在編譯過程中研究過,擦除會擦除所有的通用信息。擦除詳細?

在這裏,我研究了所有的T被替換爲Object。

Integer v = display(2); 
String d = display("3"); 

public <T> T display(T i){ 
     return i; 
    } 

我希望它會變成

Integer v = (Integer)display(2); 
String d = (String) display("3"); 
public Object display(Object i){ 
return i; 
} 

所以,是我的假設嗎?

感謝。

回答

4

你基本上擁有它。編譯器使用泛型參數類型來驗證代碼,但生成的字節碼替換爲不同的類。

對於像<T>這樣的未綁定的通用參數,它將是Object。但是,如果聲明是<T extends Comparable>,則替換的類將是Comparable而不是Object

編輯:關於Java泛型偉大的信息,儘管確實密集,在部分信息:

Java泛型常見問題 - 常見問題
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

+0

的聯繫是非常有用的感謝。 – Manoj 2011-01-24 13:05:01

0

基本上,是的。 Java中的泛型是一個很好的編譯器技巧。

1

有關泛型類型的信息不會保存到編譯類中,它僅在編譯時用於檢查類型安全性。

Integer v = display(2); 

的Java編譯器知道這種方法是「通用」,並返回同一類型作爲參數,在這種情況下,它是整數,並且結果被分配到整數,所以一切正常。

String d = display("3"); 

完全相同的把戲。但在這種情況下:

Long v = display(2); 

Java將告訴你,它不能投,因爲2意思是整數,而Java不能將它轉換爲長,所以你需要寫:

Long v = display(2L); 

正如我告訴,沒有信息將在運行時間保存在編譯的類,所以有可能你可以投入String類型的List<Integer>值,也沒有會拋出異常,但是當你讀這String,並試圖給Integer類型變量你會得到它......好吧,相當棘手;)