2009-09-19 105 views
3

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

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

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

谁能帮助我?

回答

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

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

显然,这和Peter的回答一样丑陋。

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

很少有'问题用这种方法虽然:

  • 类必须有构造函数不带参数
  • 如果构造函数抛出任何checked异常,将即使传播getObject方法不会在throws部分声明它。

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

+2

Class类是用泛型实现的,因此实际上不需要在另一个方法中包装自己的Generic'newInstance()'。 – akf 2009-09-19 13:34:10

+0

是的,我同意。我刚从问题中填入'模板'。 – 2009-09-19 15:07:01

+0

这些都不是问题;就是这样。你已经给出了这个问题的确切答案。添加重载方法getObject(Class clazz,Object ... args)并完成。 – alphazero 2009-09-19 18:25:10

8

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

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

我同意滥用反射是不可取的,但是通过这种解决方案,您可以为设计需要制造的每个类设置另一个类,或者在您制造其他类之前必须拥有一个类的成员,因为接口方法不能是静态的。 – Carl 2009-09-19 13:34:20

+0

你可以用一个短的匿名内部类来完成它(也许分配给一个静态final字段,但是因为对象创建速度太快甚至可能成为一个悲观的东西)。话虽如此,Java语法确实很糟糕,JRE并不倾向于在处理很多课程时要非常高效地处理记忆。 – 2009-09-19 13:41:07

+0

@Tom,能否详细解释一下这个问题? – eric2323223 2009-09-19 17:33:09