我有這個類:如何創建泛型類型的新對象?
public class A<T> {
protected T something = new T();
...
}
當然new T()
是不可能的。我能做些什麼呢?
我不能改變調用這個類的構造函數的代碼,因爲這是通過反射完成的。
另一個問題是如何獲取泛型類的Class對象。的MyMethod(的A.class)工作過,但現在已經拿到了參數T
我有這個類:如何創建泛型類型的新對象?
public class A<T> {
protected T something = new T();
...
}
當然new T()
是不可能的。我能做些什麼呢?
我不能改變調用這個類的構造函數的代碼,因爲這是通過反射完成的。
另一個問題是如何獲取泛型類的Class對象。的MyMethod(的A.class)工作過,但現在已經拿到了參數T
您可以收到T作爲構造函數的參數:
protected T something;
public A(T something) {
this.something = something;
}
或者,如果A的目標是要真正建立新型T的情況下,再取一個工廠的T作爲參數:
protected T something;
public A(Factory<T> somethingFactory) {
this.something = somethingFactory.newInstance();
}
Class<T>
可以被看作是一個Factory<T>
,因爲它有一個newInstance()
方法,即調用公有的無參數的構造函數。但是一個Factory<T>
可以用這個構造函數以外的東西來創建新的實例。
+1工廠解決方案非常好,但是您需要使用類'DongleFactory擴展工廠
不,也沒有辦法指定T
有一個無參數構造函數,或者甚至是非抽象的。
您可以傳入抽象工廠或原型。
請不要使用反射!
這是非常開放的。你能提供更多關於你想要完成的信息嗎? – AndrewC 2012-02-22 15:11:04
可以在運行時確定傳遞給A的類型參數,而不顯式地將該類傳遞給A的構造函數。但正如其他人所問,爲什麼當你不需要時你真的想這樣做呢? – 2012-02-22 15:15:46
(令人困惑的是,該問題使用的類名實際上與通用參數名稱匹配,因爲該問題涉及泛型。) – 2012-02-22 15:16:10