Java泛型为什么我不能实例化泛型类型

时间:2010-01-22 09:59:04

标签: java generics type-erasure

我正在使用泛型来写东西,令我惊讶的是我发现这不起作用:

class foo<T>{

 T innerT = new T();

}

所以我不能实例化泛型类型?有没有办法做到这一点?

6 个答案:

答案 0 :(得分:13)

在运行时,JVM不知道T是什么,因此无法创建类型为T. Types are erased during compilation的新对象。

答案 1 :(得分:8)

是的,这真非常令人讨厌。

我使用的工作是强制客户端在构造新的foo<T>时传递类 - 即。

public foo(Class<T> myClass)

然后您可以改为使用myClass.newInstance()

答案 2 :(得分:8)

我总是喜欢创作模式(工厂,原型,......)。 特别是

public foo(Class<T> myClass)
     

然后您可以改为使用myClass.newInstance()

是一个糟糕的解决方案,因为T可能没有空构造函数。

答案 3 :(得分:2)

这里的技巧是将构造函数“包装”在自己的对象中,然后使用该对象创建所需的类。

如果你不知道你正在实验什么课,那么你不知道它是否有一个构造函数,因此你不能称之为。

static <T> void myFunction(Provider<T> provider){
    T t = provider.get();
}

interface Provider<T>{
    public T get();
}

public class MyClass{
}

public static void main(String [] args){
    myFunction(new Provider<MyClass>(){
        public MyClass get(){
            return new MyClass();
        }
    });
}

答案 4 :(得分:1)

这是java实现泛型的方式的限制。为了在添加到语言的泛型之前允许使用泛型与遗留代码的代码兼容,使用类型擦除来实现泛型。这会给来自C ++等语言的人带来很多困惑,并期望泛型以同样的方式工作。

要了解更多有关此问题的含义,这是一个很好的link

答案 5 :(得分:0)

解决方法

如果您对类进​​行子类型化,则可以使用类的模板类型。请参阅我对另一个问题的回答 - Instantiating generics type in java