关于java:类型泛型的实例

Instance of type generic

本问题已经有最佳答案,请猛点这里访问。

我的问题是:

为什么不能用新的t()来实例化一个泛型类型,而用你能做的类类的newInstance()来代替?


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

有关更多信息,请参阅Angelika Langer关于类型擦除的常见问题条目。


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


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

1
2
3
4
5
6
7
private static class SomeContainer<E>
{
    E createContents(Class<E> clazz)
    {
        return clazz.newInstance();
    }
}

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


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

99%的时间我知道类型并使用"new whatever()"。