Java泛型为什么可以';我实例化了一个泛型类型
我用泛型写了一些东西,令我惊讶的是,我发现这不起作用:Java泛型为什么可以';我实例化了一个泛型类型,java,generics,type-erasure,Java,Generics,Type Erasure,我用泛型写了一些东西,令我惊讶的是,我发现这不起作用: class foo<T>{ T innerT = new T(); } class-foo{ T innerT=新的T(); } 那么我不能实例化泛型类型吗?没有任何方法可以做到这一点吗?在运行时,JVM不知道t是什么,因此无法创建t类型的新对象。这是java实现泛型的一个限制。为了使使用泛型的代码与添加到语言中的泛型之前的遗留代码兼容,泛型使用类型擦除实现。这会给来自C++等语言的人带来很大的困惑,并期望泛型的工作方
class foo<T>{
T innerT = new T();
}
class-foo{
T innerT=新的T();
}
那么我不能实例化泛型类型吗?没有任何方法可以做到这一点吗?在运行时,JVM不知道t是什么,因此无法创建t类型的新对象。这是java实现泛型的一个限制。为了使使用泛型的代码与添加到语言中的泛型之前的遗留代码兼容,泛型使用类型擦除实现。这会给来自C++等语言的人带来很大的困惑,并期望泛型的工作方式相同。
在这里阅读更多关于这一点的含义是一个很好的是的,这非常令人讨厌 我使用的解决方法是在构建新的
foo
-即
public foo(Class<T> myClass)
public foo(类myClass)
然后,您可以使用myClass.newInstance()。我总是喜欢创建模式(工厂、原型等)。 特别是
public foo(类myClass)
然后可以使用myClass.newInstance()
是一个糟糕的解决方案,因为T可能没有空构造函数。解决方法
如果对类进行子类型化,则可以使用该类的模板类型。查看我对另一个问题的回答-。这里的技巧是将构造函数“包装”到它自己的对象中,然后使用该对象创建所需的类
如果不知道实例化的是什么类,那么就不知道它是否有构造函数,因此不能调用它
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();
}
});
}
静态void myFunction(提供程序){
T=provider.get();
}
接口提供者{
公众不能得到();
}
公共类MyClass{
}
公共静态void main(字符串[]args){
myFunction(新提供程序(){
公共MyClass get(){
返回新的MyClass();
}
});
}
+1。类型擦除和泛型在Java中的真正含义是必须的。此外,T可能是一个接口或一个抽象类,或者一个枚举,或者只是一个普通的具体类,没有可访问的无参数构造函数。不能再少了。。。谢天谢地,男人并没有想到这一点:这个答案并不能解释为什么。在解决它之前,您应该理解它为什么会这样做。T可以是抽象类或接口,在这种情况下,解决方案绝对没有用。其他答案已经很好地解释了类型擦除的原因。我很高兴与销售代表分享,基本上不抄袭别人的话。虽然多年后我理解了类型擦除,但仍然没有必要这样做。事实上,泛化实例化将在编译时完成,因此,如果T是没有参数构造函数的接口/抽象类/类,则编译器可以解决该错误。类型擦除是一个运行时问题,而不是编译时间问题。实际上我是一个该死的C++程序员,而且我总是参与到这个………………java语言中的项目中…
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();
}
});
}