Java泛型问题

eri*_*223 3 java generics

是否可以编写一个可以创建任何指定类型实例的方法?

我认为java泛型应该有帮助,所以它可能是这样的:

    public <U> U getObject(Class klass){
        //...
    }
Run Code Online (Sandbox Code Playgroud)

谁能帮助我?

Pet*_*aný 9

public <U> U getObject(Class<U> klass) 
    throws InstantiationException, IllegalAccessException
{
    return klass.newInstance();
}
Run Code Online (Sandbox Code Playgroud)

但是这种方法几乎没有"问题":

  • class必须有没有参数的构造函数
  • 如果构造函数抛出任何已检查的异常,即使您的方法未在部分声明它,它也会被传播.getObjectthrows

有关详细信息,请参阅Class.newInstance()文档.

  • Class类是用Generics实现的,所以实际上不需要在另一个方法中包装它自己的Generic`newInstance()`. (2认同)

Car*_*arl 8

 public <U> U genericFactory(Constructor<U> classConstructor, Object..args)
  throws
   InstantiationException,
   IllegalAccessException,
   IllegalArgumentException,
   InvocationTargetException {
     return classConstructor.newInstance(args);
 }
Run Code Online (Sandbox Code Playgroud)

您可以Class<U>通过该getConstructors方法从对象获取构造函数.通过构造函数本身,您可以获得有关参数的信息,因此需要在此工厂外部添加一些额外的代码以适当地填充参数.

显然,这和彼得的答案一样难看.


Tom*_*ine 8

我强烈建议尽可能使用工厂界面,而不是滥用反射.

public interface MyFactory<T> {
     T newInstance();
}
Run Code Online (Sandbox Code Playgroud)