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

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

class foo{ T innerT = new T(); } 

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

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

我使用的工作是强制客户端在构造新的foo时传递类 – 即

 public foo(Class myClass) 

然后你可以使用myClass.newInstance()代替。

在运行时,JVM不知道T是什么,因此无法创建类型为T的新对象。 在编译期间会删除类型 。

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

 public foo(class myClass) 

然后你可以使用myClass.newInstance()代替。

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

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

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

 static  void myFunction(Provider provider){ T t = provider.get(); } interface Provider{ public T get(); } public class MyClass{ } public static void main(String [] args){ myFunction(new Provider(){ public MyClass get(){ return new MyClass(); } }); } 

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

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

解决方法

如果对其进行子类型化,则可以使用类的模板类型。 请参阅我对另一个问题的回答 – 在java中实例化generics类型 。