2012-02-22 40 views
2

我有這個類:如何創建泛型類型的新對象?

public class A<T> { 
    protected T something = new T(); 
    ... 
} 

當然new T()是不可能的。我能做些什麼呢?

我不能改變調用這個類的構造函數的代碼,因爲這是通過反射完成的。

另一個問題是如何獲取泛型類的Class對象。的MyMethod(的A.class)工作過,但現在已經拿到了參數T

+0

這是非常開放的。你能提供更多關於你想要完成的信息嗎? – AndrewC 2012-02-22 15:11:04

+0

可以在運行時確定傳遞給A的類型參數,而不顯式地將該類傳遞給A的構造函數。但正如其他人所問,爲什麼當你不需要時你真的想這樣做呢? – 2012-02-22 15:15:46

+0

(令人困惑的是,該問題使用的類名實際上與通用參數名稱匹配,因爲該問題涉及泛型。) – 2012-02-22 15:16:10

回答

9

您可以收到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>可以用這個構造函數以外的東西來創建新的實例。

+0

+1工廠解決方案非常好,但是您需要使用類'DongleFactory擴展工廠',因此您可以在'newInstance'方法內調用'new Dongle()'。否則,你不會在工廠中遇到同樣的問題。 – 2012-02-22 15:13:12

7

你可以有一個構造函數(或方法),其採用Class<T>參數,並有clazz.newInstance()

當你實例化對象,你知道的類型,所以你必須:

A<Foo> a = new A<Foo>(Foo.class); 
+0

我不能改變我的類的構造函數被調用的代碼。 – yoooshi 2012-02-22 15:12:29

+1

然後 - 沒辦法.. – Bozho 2012-02-22 15:15:03

+0

1.你應該說這是你問題的一部分。 2.爲什麼這種情況在你無法修改的班級中存在?或者你只能修改部分內容?我不明白 - 這是功課嗎? – 2012-02-22 15:16:37

0

不,也沒有辦法指定T有一個無參數構造函數,或者甚至是非抽象的。

您可以傳入抽象工廠或原型。

請不要使用反射!

相關問題