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();
        }
    });
}