Java中泛型中的擦除概念是什么?

推荐答案

基本上,泛型是通过编译技巧在Java中实现的.编译后的泛型代码actually只使用java.lang.Object,不管你在哪里谈论T(或其他类型参数)——并且有一些元数据告诉编译器它确实是泛型类型.

当您针对泛型类型或方法编译一些代码时,编译器会计算出您真正的意思(即T的类型参数是什么),并在compile时验证您所做的事情是否正确,但发出的代码再次只是根据java.lang.Object进行对话——必要时,编译器会生成额外的强制转换.在执行时,a List<String>和a List<Date>完全相同;额外的类型信息已被编译器删除.

比方说,与C#相比,在C#中,信息在执行时被保留,允许代码包含typeof(T)等等价于T.class的表达式-除非后者是无效的.(请注意,.NET泛型和Java泛型之间还有进一步的区别.)在处理Java泛型时,类型擦除是许多"奇怪的"警告/错误消息的来源.

其他资源:

Java相关问答推荐

如果您仅同步写操作,Java布尔线程是否安全

如何在PFA中使用不确定的进度指标制作可暂停的任务?

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

如何使用jooq generator将表名和列名映射为人类可读的?

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

使用动态ID从json获取详细信息的Jolt规范

如何对多个字段进行分组和排序?

Jolt变换JSON数组问题

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

Kotlin Val是否提供了与Java最终版相同的可见性保证?

基于配置switch 的@Controller的条件摄取

如何使这两种方法合二为一?

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

如何处理两个几乎相同的XSD文件?

Win32函数的JNA绑定DwmGetColorizationColor返回E_INVALIDARG错误

在Java中使用StorageReference将数据从Firebase存储添加到数组列表

如何在特定关键字后提取与模式匹配的多个值?

读取ConcurrentHashMap中的可变对象

Spring Mapstruct如何获取Lazy初始化实体字段的信息?

如何在更改分辨率时将鼠标坐标计算为世界坐标