2013-04-10 67 views
2
import java.util.*; 

public class Main <T> { 

    public void guru(List<Integer> list) { 
     System.out.println("INteger"); 
    } 

    public static void main(String[] args) { 
     List<String> list = new ArrayList<String>(); 
     new Main().guru(list); 
    } 
} 

在我看來,調用奇怪的JDK行爲是否應該編譯?

guru(List<String>); //no type erasure during compiling... 

應引起編譯失敗。

那會發生什麼,如果我們創建對象:

new Main<Integer>() //or any other type 

誰能告訴我這是怎麼回事?這是JDK中的錯誤,或者實例化沒有參數的參數化對象可能導致這樣的問題,爲什麼?

我可以補充一點,如果我們改變主要定義:

public class Main { 

編譯失敗,符合市場預期。

回答

6

的問題是在這裏:

new Main().guru(list); 
     ^^^^ 

您使用的Main的原始版本(不包括仿製藥),因此所有的通用信息被忽略。你應該得到一個編譯器警告。

如果你嘗試:

new Main<SomeType>().guru(list); 

你應該得到一個編譯錯誤。

更準確地,使用原始類型時:new Main(),進行類型擦除,這不僅從擦除類型本身一般信息,但also from its methods

的類型構造函數(§8.8) ,實例方法(§8.4,§9.4)或非靜態字段(§8.3)M是原始類型C [...]的原始類型,對應於在對應於C的泛型聲明中刪除其類型的原始類型

+0

非常感謝,我認爲原始版本意味着只有實際參數被忽略(在本例中爲)。這解釋了一切。 – user2266059 2013-04-10 12:57:51