Java泛型擦除的原理及其影响是什么?
作者:小宇宙叶知秋
时间:2023-04-25
浏览:4
1、说明在编译过程中,可以获得类型变量的信息。因此,set方法可以在编译器中进行类型检查,非法类型不能通过编译。但是对于get方法,由于擦除机制,操作时的实际引用类型是Object类型。为了恢复返回结果的类型,编译器在get后添加了类型转换。因此,在genericHolder.class文件main方法主体的第18行有类型转换的逻辑。这是编译器自动添加的。因此,我们处理了泛型对象的读写位置,并对代码添加了限制。2、实例//GenericHolder.javapublicclassGenericHolder
本文目录
1、说明
在编译过程中,可以获得类型变量的信息。因此,set方法可以在编译器中进行类型检查,非法类型不能通过编译。但是对于get方法,由于擦除机制,操作时的实际引用类型是Object类型。
为了恢复返回结果的类型,编译器在get后添加了类型转换。因此,在genericHolder.class文件main方法主体的第18行有类型转换的逻辑。这是编译器自动添加的。
因此,我们处理了泛型对象的读写位置,并对代码添加了限制。
2、实例
//GenericHolder.java public class GenericHolder{ T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } public static void main(String[] args) { GenericHolder holder = new GenericHolder<>(); holder.setObj("Item"); String s = holder.getObj(); } } //GenericHolder.class public class GenericHolder { T obj; public GenericHolder(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object." ":()V 4: return public T getObj(); Code: 0: aload_0 1: getfield #2 // Field obj:Ljava/lang/Object; 4: areturn public void setObj(T); Code: 0: aload_0 1: aload_1 2: putfield #2 // Field obj:Ljava/lang/Object; 5: return public static void main(java.lang.String[]); Code: 0: new #3 // class GenericHolder 3: dup 4: invokespecial #4 // Method " ":()V 7: astore_1 8: aload_1 9: ldc #5 // String Item 11: invokevirtual #6 // Method setObj:(Ljava/lang/Object;)V 14: aload_1 15: invokevirtual #7 // Method getObj:()Ljava/lang/Object; 18: checkcast #8 // class java/lang/String 21: astore_2 22: return }
作者最新文章
blender几何节点功能怎么开启教程界面入口与启用步骤
2026-10-18 13:20
PDF删页删错怎么找回?PDF删页报参数错误怎么办?
2026-10-17 11:21
蚂蚁庄园1月18日:人们常用砸锅来形容事情没办成猜猜最早源于哪个行业
2026-09-24 16:59
索尼WH-1000XM4C发布:复刻经典折叠设计并升级现代接口
2026-09-08 19:10
python题库环境搭建与排错:从基础概念到命令验证
2026-09-05 09:32
上一篇:
怎么使用Java服务器处理图片上传
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多

































