2010-10-26 77 views
6

我的問題是關於泛型類和方法中使用的類型變量。Java通用類型變量

爲什麼我們不能這樣做T = new T();或換句話說,爲什麼我們不能構造一個類型變量的對象?

我知道,在編譯過程中的通用信息將被刪除,一切都轉化爲
對象,那麼爲什麼不編譯器假定T是一個對象,讓我們構建呢?

+0

這是一個很好的問題。它說明了Java泛型中固有的一些缺陷以及抽象中的一些泄漏。順便說一句,你也不能創建一個數組'T []'出於同樣的原因 - 類型擦除。 – 2010-10-26 08:38:07

回答

9

問題是,在運行時,JVM不知道T實際上代表了哪個類(該信息在運行時不保留,這就是「類型擦除」的含義)。因此,JVM只是看到你想構建一個新的T,但不知道實際調用哪個構造函數 - 因此它是不允許的。

有解決方法,但它不會按您的建議工作。

爲什麼不編譯器,假定T 是一個對象,讓我們構造它 ?

嗯,當然,運行時可能只是構建的java.lang.Object給你一個實例,但不會真正的幫助,因爲你真的想要一個T

+0

有一點,運行時看到T或Object,是不是通用信息擦除了? – 2010-10-26 08:37:20

+0

我不知道運行時「看到」什麼,因爲我不知道這是如何在內部實現的。我相信它根本沒有看到任何類型。它可能可以區分代碼中真正存在「Object」的情況以及類型被擦除的情況。 – sleske 2010-10-26 08:41:24

+1

它只是看到一個「對象」。 – 2010-10-26 09:03:39

2

除了sleske的回答,如果您需要在泛型類中創建T的對象,解決方案是將參考作爲參數傳遞給構造函數或需要創建新對象並使用該類創建新實例的方法。

+1

或通過工廠? – Ishtar 2010-10-26 08:40:51

+0

是的,這就是我所說的「有解決方法」。感謝您添加它:-)。 – sleske 2010-10-26 08:42:34

+0

我不會寬恕這種方法,但是如果你喜歡編寫非常黑的代碼,你仍然可以使用反射來解決它。 '((ParametrizedType)的getClass())。getActualTypeArguments()[0] .createNewInstance()'。這當然假設一個默認的構造函數。 – 2010-10-26 10:02:55