Java泛型问题
是否可以编写一个可以创建任何指定类型实例的方法 我认为java泛型应该有所帮助,所以可能是这样的:Java泛型问题,java,generics,Java,Generics,是否可以编写一个可以创建任何指定类型实例的方法 我认为java泛型应该有所帮助,所以可能是这样的: public <U> U getObject(Class klass){ //... } public U getObject(类klass){ //... } 有人能帮我吗?public U getObject(类klass) public <U> U getObject(Class<U> klass) throw
public <U> U getObject(Class klass){
//...
}
public U getObject(类klass){
//...
}
有人能帮我吗?public U getObject(类klass)
public <U> U getObject(Class<U> klass)
throws InstantiationException, IllegalAccessException
{
return klass.newInstance();
}
抛出实例化异常,IllegalAccessException
{
返回klass.newInstance();
}
不过,这种方法几乎没有“问题”:
- 类必须具有不带参数的构造函数
- 若构造函数抛出任何选中的异常,它将被传播,即使您的
方法没有在getObject
部分声明它抛出
public U genericFactory(构造函数类构造函数,对象..args)
public <U> U genericFactory(Constructor<U> classConstructor, Object..args)
throws
InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException {
return classConstructor.newInstance(args);
}
投掷
实例化异常,
非法访问例外,
IllegalArgumentException,
调用目标异常{
返回classConstructor.newInstance(args);
}
您可以通过getConstructors
方法从Class
对象获取构造函数。通过构造函数本身,您可以获得有关参数的信息,因此需要在这个工厂之外有一些额外的代码来适当地填充参数
显然,这和Peter的答案一样难看。我强烈建议尽可能使用工厂界面,而不是滥用反射
public interface MyFactory<T> {
T newInstance();
}
公共接口MyFactory{
T newInstance();
}
这个类是用泛型实现的,因此实际上没有必要将它自己的泛型newInstance()
包装到另一个方法中。是的,我同意。我只是填写了问题中的“模板”,这些不是问题;事实就是这样。你对这个问题给出了准确的答案。添加重载方法getObject(类clazz,Object…args)就完成了。我同意滥用反射是不可取的,但使用此解决方案,设计需要制造的每个类都有另一个类,或者在制造其他类之前必须有一个类的成员,由于接口方法不能是静态的,所以可以使用一个简短的匿名内部类来实现(可能被分配到一个静态的final字段,但因为对象创建速度太快,甚至可能令人感到悲观。话虽如此,Java语法确实很糟糕,JRE在处理许多类时往往不是很节省内存。@Tom,你能更详细地解释一下吗?