Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型类型变量_Java_Generics - Fatal编程技术网

Java泛型类型变量

Java泛型类型变量,java,generics,Java,Generics,我的问题是关于泛型类和方法中使用的类型变量 为什么我们不能这样做呢

我的问题是关于泛型类和方法中使用的类型变量

为什么我们不能这样做呢 我知道在编译过程中,通用信息会被删除,所有内容都会转换为

对象,那么为什么编译器不假设
t
是一个对象,让我们来构造它呢?

问题是,在运行时,JVM不知道
t
实际上代表哪个类(运行时不保留该信息,这就是“类型擦除”的意思)。因此,JVM只看到您想要构造一个新的
T
,但不知道实际调用哪个构造函数——因此不允许这样做

有一些变通办法,但不会像你建议的那样奏效

为什么编译器不假设t 是一个对象,让我们来构造它 ?


当然,运行时可以为您构造一个
java.lang.Object
的实例,但这并没有真正的帮助,因为除了sleske的答案之外,您还需要一个
T
;如果您需要在泛型类中创建T对象,解决方案是将一个
引用作为参数传递给需要创建新对象并使用该类创建新实例的构造函数或方法。

有一件事,运行时是否看到T或Object,泛型信息是否被删除,?我不知道运行时“看到”了什么,因为我不知道这是如何在内部实现的。我相信它根本看不到任何类型。它可能可以区分代码中真正写入了“对象”的情况和类型被删除的情况。这是一个好问题。它说明了Java泛型固有的一些缺点和抽象中的一些漏洞。顺便说一句,您也无法创建数组
T[]
,原因与此相同——键入擦除。是的,这就是我所说的“有解决办法”的意思。感谢您添加:-)。我不允许这种方法,但是如果您喜欢编写真正的黑客代码,您仍然可以使用反射来解决它<代码>((ParameterizedType)getClass()).getActualTypeArguments()[0]。createNewInstance()。当然,这假设了一个默认构造函数。