Java 泛型问题

3

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

我认为 Java 泛型应该可以帮助实现,代码可能如下:

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

Could anyone help me?

3个回答

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

这种方法存在一些问题:

  • 类必须有一个无参构造函数
  • 如果构造函数抛出任何已检查的异常,即使您的getObject方法没有在throws部分声明它,它也会被传播

详见Class.newInstance()文档。


2
Class类已经使用泛型实现,因此真的没有必要在另一个方法中包装其自己的泛型newInstance() - akf
是的,我同意。我只是从问题中填写了“模板”。 - Peter Štibraný
这些不是问题,就是这样。你已经给出了精确的答案。添加重载方法getObject(Class<U> clazz, Object...args)即可完成。 - alphazero

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

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

显然,这与Peter的答案一样丑陋。


8

我强烈建议尽可能使用工厂接口,而不是滥用反射技术。

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

我同意滥用反射是不可取的,但是使用这种解决方案,你需要为每个设计所需制造的类添加另一个类,或者在制造其他类之前必须拥有一个类的成员,因为接口方法不能是静态的。 - Carl
你可以使用一个短的匿名内部类来实现(可能分配给一个静态final字段,但由于对象创建非常快,这甚至可能是一种悲观化。话虽如此,Java语法确实很糟糕,JRE在处理许多类时也不太能够高效地利用内存。) - Tom Hawtin - tackline
@Tom,请问你能详细解释一下吗? - eric2323223

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接