是否可以编写一个可以创建任何指定类型实例的方法?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