我正在使用泛型来写东西,令我惊讶的是我发现这不起作用:
class foo<T>{
T innerT = new T();
}
所以我不能实例化泛型类型?有没有办法做到这一点?
答案 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。