java - 为什么类型变量在java中是不可具体化的类型
问题描述
我目前正在学习 java 泛型,下面是 java 中不可具体化的类型列表。
如果类型是以下之一,则它是不可具体化的:
• 类型变量(例如T
)
• 具有实际参数的参数化类型(例如List<Number>, ArrayList<String>, or Map<String, Integer>
)
• 带边界的参数化类型(例如List<? extends Number> or Comparable<? super String>
)
我明白为什么带实参的参数化类型和带绑定的参数化类型是不可引用的,因为在运行时擦除之后,唯一剩下的类型信息是List
,但为什么类型变量(例如T
)是不可具体化的类型?我以为在运行时,类型擦除后T
会变成Object
(给定T
的是一个未绑定的类型参数),所以类型信息是可用的。
我的理解有问题吗?
解决方案
当一个对象的类型信息在编译时没有丢失时,它是可具体化的。某些操作是不允许在不可具体化的对象上进行的。例如,我们不能做一个实例。
泛型类型是不可具体化的,这就是为什么我们不能这样做
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
不知道对你有没有帮助,如果没有我可以删除它,祝你有美好的一天!
推荐阅读
- c# - MongoDB增量与对应列的限制c#
- r - 将定制功能应用于列对并创建汇总表
- android - 如何使用 CameraX 禁用降噪
- javascript - jquery remove() 只跳过选择选项,而不是删除它们
- html - 从简单 Rmarkdown 网站的索引页中排除页脚
- puppeteer - 如何使用 Puppeteer 检查特定元素(不是页面)上是否存在文本
- python - Kivy 对象没有属性(不透明度)
- kubernetes - rancher 服务器关闭时无法访问 rancher/k8s 集群
- apache-superset - 是否有任何超集 API 来打开仪表板?
- discord - 如何检查多个角色 discord.js v12