Java泛型在编译期被擦除,类型参数替换为上界(默认Object),导致运行时无法获取泛型信息,但字段、方法签名等声明处的泛型可通过反射有限获取。

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 简单的使用;JSON.NET使用来将.NET中的对象转换为JSON字符串(序列化),或者将JSON字符串转换为.NET中已有类型的对象(反序列化?)。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
0
立即学习“Java免费学习笔记(深入)”;
new T() 实例化泛型类型(编译错误)→ 可传入 Class<t></t> 参数,通过 clazz.getDeclaredConstructor().newInstance()
instanceof T(T 是类型变量)→ 只能判断擦除后的上界,如 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速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号