泛型类型的实例[重复]

Posted

技术标签:

【中文标题】泛型类型的实例[重复]【英文标题】:Instance of type generic [duplicate] 【发布时间】:2010-07-06 14:27:15 【问题描述】:

我的问题是这样的:

为什么不能用new T()来实例化一个泛型类型,而用类Class的newInstance()可以呢?

【问题讨论】:

相关:***.com/questions/75175/…, ***.com/questions/731452/… 如果T 没有合适的构造函数怎么办? 【参考方案1】:

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

【讨论】:

【参考方案2】:

由于类型擦除:泛型类型在执行时不知道T 是什么,所以它不能调用正确的构造函数。

更多信息请参见Angelika Langer's FAQ entry on type erasure。

【讨论】:

【参考方案3】:

也许,您正在查看这种模式(取自对另一个 question 的回答):

private static class SomeContainer<E>

    E createContents(Class<E> clazz)
    
        return clazz.newInstance();
    

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

【讨论】:

【参考方案4】:

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

99% 的时间我都知道类型并且我使用“newwhatever()”。

【讨论】:

以上是关于泛型类型的实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型

实例化泛型类时如何避免指定冗余类型

Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

如何通过使用类型名称来实例化泛型类?

将实例化的 System.Type 作为泛型类的类型参数传递

根据 Class<T> 的类型创建泛型类的实现实例