首页 > Java > java教程 > 正文

java泛型中类型擦除的转换

舞夢輝影
发布: 2025-12-05 06:29:31
原创
795人浏览过
Java泛型在编译期被擦除,类型参数替换为上界(默认Object),导致运行时无法获取泛型信息,但字段、方法签名等声明处的泛型可通过反射有限获取。

java泛型中类型擦除的转换

Java泛型在编译期会被擦除,也就是说,泛型信息不会保留到运行时。类型擦除后,所有泛型参数都被替换为它们的上界(通常是 Object),而泛型类或方法在字节码中表现为“原始类型”。这不是简单的语法糖,而是 JVM 层面不支持泛型的直接体现。

泛型类的类型擦除规则

泛型类在编译后,其类型参数被擦除,类本身退化为原始类型:

  • List<string></string> → 编译后等价于 List(即 List<object></object> 的原始形式)
  • class Box<t extends number> { T value; }</t> → 擦除为 class Box { Number value; },因为 T 的上界是 Number
  • 若无显式上界(如 <t></t>),默认上界为 Object,所以 T 全部替换成 Object

泛型方法的类型擦除转换

泛型方法同样经历擦除,但需注意桥接方法(bridge method)的生成:

  • <t> T getValue() { ... }</t> → 编译后变为 Object getValue()
  • 若该方法被子类重写(如子类声明 <string> String getValue()</string>),编译器会自动生成一个桥接方法:Object getValue(),内部调用 String getValue(),以保证多态正确性
  • 桥接方法对开发者透明,但可通过反射观察到(如 getDeclaredMethods() 中能看到两个同名方法)

类型擦除带来的限制与应对

由于运行时泛型信息不存在,以下操作无法直接进行:

JSON.NET 简单的使用 中文WORD版
JSON.NET 简单的使用 中文WORD版

本文档主要讲述的是JSON.NET 简单的使用;JSON.NET使用来将.NET中的对象转换为JSON字符串(序列化),或者将JSON字符串转换为.NET中已有类型的对象(反序列化?)。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

JSON.NET 简单的使用 中文WORD版 0
查看详情 JSON.NET 简单的使用 中文WORD版

立即学习Java免费学习笔记(深入)”;

  • 不能用 new T() 实例化泛型类型(编译错误)→ 可传入 Class<t></t> 参数,通过 clazz.getDeclaredConstructor().newInstance()
  • 不能使用 instanceof TT 是类型变量)→ 只能判断擦除后的上界,如 obj instanceof List
  • 不能定义 throw new T()catch (T e) → 异常类型必须是具体类
  • 数组创建受限:不能写 new T[10] → 可改用 new Object[10] 并强制转型(带 unchecked 警告),或用 ArrayList<t></t>

运行时获取泛型信息的例外情况

虽然泛型被擦除,但部分结构仍保留签名信息,可通过反射有限访问:

  • 字段、方法参数、返回值上的泛型类型可用 Field.getGenericType()Method.getGenericReturnType() 等获取 Type 对象
  • 仅限“声明位置”保留的信息,例如 private List<string> items;</string> 中的 List<string></string> 可反射读出;但局部变量或方法调用处的 List<string></string> 不可查
  • 泛型超类/接口(如 class MyList extends ArrayList<string></string>)可通过 getGenericSuperclass() 获取实际类型参数

基本上就这些。类型擦除是 Java 泛型的设计取舍,它保证了与旧版本的二进制兼容,也带来了一些编码约束。理解擦除时机和表现,有助于写出更健壮、可调试的泛型代码。

以上就是java泛型中类型擦除的转换的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号