2013-09-28 55 views
0

代碼:實例化一個泛型類

class MyClass<T>{ 
    public void method(){ 
     new ArrayList<T>();//OK- Why? 
    } 
} 

爲什麼在這種情況下,我們還沒有一個編譯錯誤。類型T在編譯時與特定類型不匹配。

+1

請通過[官方'泛型'教程](http://docs.oracle.com/javase/tutorial/extra/generics/index.html) –

回答

3

當您創建MyClass的實例時,您將必須提供類型T。所以,當撥打method時,T型號將被綁定到T的任何類型,在MyClass的構造中定義。

+0

謝謝!但是,如果我試圖添加靜態修飾符'方法'我有編譯錯誤。爲什麼發生? –

+0

由於T是在創建實例時定義的。靜態方法存在沒有實例。 –

0

您正在實例化一個ArrayList而不是一個T。 Javac可以知道ArrayList在編譯時有一個沒有參數的默認構造函數,所以沒有問題。

1

從技術上講,Java編譯器不需要知道生成代碼的確切類型。它在所謂的擦除過程中將所有泛型類型轉換爲對象。

當然,在編譯時它會檢查程序是否「類型正確」。在這種情況下,因爲T只是在建造時給予這個類的一個參數。因此,當您撥打new ArrayList<T>時,類型ArrayList<T>被定義,因爲類型T被認爲是已知的。