代碼:實例化一個泛型類
class MyClass<T>{
public void method(){
new ArrayList<T>();//OK- Why?
}
}
爲什麼在這種情況下,我們還沒有一個編譯錯誤。類型T
在編譯時與特定類型不匹配。
代碼:實例化一個泛型類
class MyClass<T>{
public void method(){
new ArrayList<T>();//OK- Why?
}
}
爲什麼在這種情況下,我們還沒有一個編譯錯誤。類型T
在編譯時與特定類型不匹配。
當您創建MyClass
的實例時,您將必須提供類型T
。所以,當撥打method
時,T
型號將被綁定到T
的任何類型,在MyClass
的構造中定義。
謝謝!但是,如果我試圖添加靜態修飾符'方法'我有編譯錯誤。爲什麼發生? –
由於T是在創建實例時定義的。靜態方法存在沒有實例。 –
您正在實例化一個ArrayList
而不是一個T
。 Javac可以知道ArrayList
在編譯時有一個沒有參數的默認構造函數,所以沒有問題。
從技術上講,Java編譯器不需要知道生成代碼的確切類型。它在所謂的擦除過程中將所有泛型類型轉換爲對象。
當然,在編譯時它會檢查程序是否「類型正確」。在這種情況下,因爲T只是在建造時給予這個類的一個參數。因此,當您撥打new ArrayList<T>
時,類型ArrayList<T>
被定義,因爲類型T被認爲是已知的。
請通過[官方'泛型'教程](http://docs.oracle.com/javase/tutorial/extra/generics/index.html) –