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类型 。