2010-07-06 89 views
2

的我的问题是这样的:实例类型的通用

为什么不能实例化一个泛型类型的类级,你可以做的新T(),而是用的newInstance()?

+0

关联:http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in​​-java,http://stackoverflow.com/questions/731452/create-instance-of-泛型 – 2010-07-06 14:35:14

+1

如果'T'没有合适的构造函数呢? – 2010-07-06 15:25:14

回答

7

您需要使用反射(newInstance()),因为在编译时其构造函数需要链接的类未知。所以编译器不能生成链接。

1

也许,你看这个模式(从答案带到另一个question):

private static class SomeContainer<E> 
{ 
    E createContents(Class<E> clazz) 
    { 
     return clazz.newInstance(); 
    } 
} 

在这里,当我们创建一个SomeContainer,我们parametize的实例与具体类(如String) 。 createContents只接受String.classString.class.newInstance()将创建一个新的(空的)字符串。

0

如果您在编译时知道类型,请使用“new Whatever()”。如果您在编译时不知道该类型,但可以为它获取一个Class对象,请使用newInstance()。

99%的时间我知道类型,我用“新的Whatever()”。