首页 > 解决方案 > 为什么类型变量在java中是不可具体化的类型

问题描述

我目前正在学习 java 泛型,下面是 java 中不可具体化的类型列表。

如果类型是以下之一,则它是不可具体化的:

• 类型变量(例如T

• 具有实际参数的参数化类型(例如List<Number>, ArrayList<String>, or Map<String, Integer>

• 带边界的参数化类型(例如List<? extends Number> or Comparable<? super String>

我明白为什么带实参的参数化类型和带绑定的参数化类型是不可引用的,因为在运行时擦除之后,唯一剩下的类型信息是List,但为什么类型变量(例如T)是不可具体化的类型?我以为在运行时,类型擦除后T会变成Object(给定T的是一个未绑定的类型参数),所以类型信息是可用的。

我的理解有问题吗?

标签: javagenericscollections

解决方案


当一个对象的类型信息在编译时没有丢失时,它是可具体化的。某些操作是不允许在不可具体化的对象上进行的。例如,我们不能做一个实例。

泛型类型是不可具体化的,这就是为什么我们不能这样做

 List <Conference> instance

这在某些情况下是实用的,但我们不能忘记 JDK 必须从一个版本向后兼容到另一个版本。这个约束解释了实现中的一些限制。

如果 Java 类型在执行期间被完全表示(没有擦除类型),则它是可具体化的:

 primitive type
 non-parametric type
 parametric type in which all arguments of type are unbounded jokers (List <?>)
 type "raw" (List)
 table whose type of elements is reifiable

不知道对你有没有帮助,如果没有我可以删除它,祝你有美好的一天!


推荐阅读