类型通用的实例

我的问题是:

为什么不能使用新的T()实例化generics类型,而使用类Class的newInstance()来实现?

您需要使用reflection( newInstance() ),因为在编译时,构造函数需要链接的类是未知的。 所以编译器无法生成链接。

由于类型擦除 :generics类型在执行时不知道T是什么,因此它无法调用正确的构造函数。

有关(更多)更多信息,请参阅Angelika Langer关于类型擦除的FAQ条目 。

也许,你正在看这种模式(取自另一个问题的答案):

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

在这里,当我们创建SomeContainer ,我们使用具体类(如String )对实例进行参数化。 createContents只接受String.classString.class.newInstance()将创建一个新的(空)String。

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

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