我的问题是:
为什么不能使用新的T()实例化泛型类型,而使用类Class的newInstance()来实现?
答案 0 :(得分:7)
您需要使用反射(newInstance()
),因为在编译时,构造函数需要链接的类是未知的。所以编译器无法生成链接。
答案 1 :(得分:7)
由于类型擦除:泛型类型在执行时不知道T
是什么,因此无法调用正确的构造函数。
有关(更多)更多信息,请参阅Angelika Langer's FAQ entry on type erasure。
答案 2 :(得分:1)
也许,你正在看这种模式(取自另一个question的答案):
private static class SomeContainer<E>
{
E createContents(Class<E> clazz)
{
return clazz.newInstance();
}
}
在这里,当我们创建SomeContainer
时,我们使用具体类(如String
)对实例进行参数化。 createContents
仅接受String.class
,String.class.newInstance()
将创建一个新的(空)字符串。
答案 3 :(得分:0)
如果您在编译时知道类型,请使用“new Whatever()”。如果您在编译时不知道类型但可以获取它的Class对象,请使用newInstance()。
99%的时间我都知道这种类型,我使用“new Whatever()”。