2009-09-19 142 views
3

是否可以編寫一個可以創建任何指定類型實例的方法?Java泛型問題

我認爲Java泛型應該幫助,所以它可能是這樣的:

public <U> U getObject(Class klass){ 
     //... 
    } 

誰能幫助我?

回答

8
public <U> U genericFactory(Constructor<U> classConstructor, Object..args) 
    throws 
    InstantiationException, 
    IllegalAccessException, 
    IllegalArgumentException, 
    InvocationTargetException { 
    return classConstructor.newInstance(args); 
} 

你可以通過getConstructors方法從Class<U>對象的構造。通過構造函數本身,您可以獲得有關參數的信息,因此需要在該工廠外部添加一些額外的代碼才能適當地填充參數。

顯然,這和Peter的回答一樣醜陋。

9
public <U> U getObject(Class<U> klass) 
    throws InstantiationException, IllegalAccessException 
{ 
    return klass.newInstance(); 
} 

很少有'問題用這種方法雖然:

  • 類必須有構造函數不帶參數
  • 如果構造函數拋出任何checked異常,將即使傳播getObject方法不會在throws部分聲明它。

有關詳細信息,請參閱Class.newInstance()文檔。

+2

Class類是用泛型實現的,因此實際上不需要在另一個方法中包裝自己的Generic'newInstance()'。 – akf 2009-09-19 13:34:10

+0

是的,我同意。我剛從問題中填入'模板'。 – 2009-09-19 15:07:01

+0

這些都不是問題;就是這樣。你已經給出了這個問題的確切答案。添加重載方法getObject(Class clazz,Object ... args)並完成。 – alphazero 2009-09-19 18:25:10

8

我強烈建議儘可能使用工廠界面,而不是濫用反射。

public interface MyFactory<T> { 
    T newInstance(); 
} 
+0

我同意濫用反射是不可取的,但是通過這種解決方案,您可以爲設計需要製造的每個類設置另一個類,或者在您製造其他類之前必須擁有一個類的成員,因爲接口方法不能是靜態的。 – Carl 2009-09-19 13:34:20

+0

你可以用一個短的匿名內部類來完成它(也許分配給一個靜態final字段,但是因爲對象創建速度太快甚至可能成爲一個悲觀的東西)。話雖如此,Java語法確實很糟糕,JRE並不傾向於在處理很多課程時要非常高效地處理記憶。 – 2009-09-19 13:41:07

+0

@Tom,能否詳細解釋一下這個問題? – eric2323223 2009-09-19 17:33:09