类型通用的实例
我的问题是:
为什么不能使用新的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.class
, String.class.newInstance()
将创建一个新的(空)String。
如果您在编译时知道类型,请使用“new Whatever()”。 如果您在编译时不知道类型但可以获取它的Class对象,请使用newInstance()。
99%的时间我都知道类型,我使用“new Whatever()”。