是否可以編寫一個可以創建任何指定類型實例的方法?Java泛型問題
我認爲Java泛型應該幫助,所以它可能是這樣的:
public <U> U getObject(Class klass){
//...
}
誰能幫助我?
是否可以編寫一個可以創建任何指定類型實例的方法?Java泛型問題
我認爲Java泛型應該幫助,所以它可能是這樣的:
public <U> U getObject(Class klass){
//...
}
誰能幫助我?
public <U> U genericFactory(Constructor<U> classConstructor, Object..args)
throws
InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException {
return classConstructor.newInstance(args);
}
你可以通過getConstructors
方法從Class<U>
對象的構造。通過構造函數本身,您可以獲得有關參數的信息,因此需要在該工廠外部添加一些額外的代碼才能適當地填充參數。
顯然,這和Peter的回答一樣醜陋。
public <U> U getObject(Class<U> klass)
throws InstantiationException, IllegalAccessException
{
return klass.newInstance();
}
很少有'問題用這種方法雖然:
getObject
方法不會在throws
部分聲明它。有關詳細信息,請參閱Class.newInstance()文檔。
我強烈建議儘可能使用工廠界面,而不是濫用反射。
public interface MyFactory<T> {
T newInstance();
}
我同意濫用反射是不可取的,但是通過這種解決方案,您可以爲設計需要製造的每個類設置另一個類,或者在您製造其他類之前必須擁有一個類的成員,因爲接口方法不能是靜態的。 – Carl 2009-09-19 13:34:20
你可以用一個短的匿名內部類來完成它(也許分配給一個靜態final字段,但是因爲對象創建速度太快甚至可能成爲一個悲觀的東西)。話雖如此,Java語法確實很糟糕,JRE並不傾向於在處理很多課程時要非常高效地處理記憶。 – 2009-09-19 13:41:07
@Tom,能否詳細解釋一下這個問題? – eric2323223 2009-09-19 17:33:09
Class類是用泛型實現的,因此實際上不需要在另一個方法中包裝自己的Generic'newInstance()'。 – akf 2009-09-19 13:34:10
是的,我同意。我剛從問題中填入'模板'。 – 2009-09-19 15:07:01
這些都不是問題;就是這樣。你已經給出了這個問題的確切答案。添加重載方法getObject(Class clazz,Object ... args)並完成。 – alphazero 2009-09-19 18:25:10