【说站】Java泛型擦除的原理分析
2024-10-09
51
Java泛型擦除的原理分析
1、说明
在编译过程中,可以获得类型变量的信息。因此,set方法可以在编译器中进行类型检查,非法类型不能通过编译。但是对于get方法,由于擦除机制,操作时的实际引用类型是Object类型。
为了恢复返回结果的类型,编译器在get后添加了类型转换。因此,在genericHolder.class文件main方法主体的第18行有类型转换的逻辑。这是编译器自动添加的。
因此,我们处理了泛型对象的读写位置,并对代码添加了限制。
2、实例
//GenericHolder.java public class GenericHolder<T> { T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } public static void main(String[] args) { GenericHolder<String> holder = new GenericHolder<>(); holder.setObj("Item"); String s = holder.getObj(); } } //GenericHolder.class public class GenericHolder<T> { T obj; public GenericHolder(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()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 "<init>":()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 }
以上就是Java泛型擦除的原理分析,希望对大家有所帮助。更多Java学习指路:Java基础
本教程操作环境:windows7系统、java10版,DELL G3电脑。
更新于:1个月前赞一波!
相关文章
- 【说站】java方法重载的无效探究
- 【说站】java重载方法的参数设置
- 【说站】java内存溢出的四种情况
- 【说站】python gevent的原理分析
- 【说站】java抽象类和接口的区别探究
- 【说站】java多态中成员如何访问
- 【说站】java代码块的执行顺序是什么
- 【说站】java继承的优缺点分析
- 【说站】java动态绑定如何理解?
- 【说站】java静态绑定是什么
- 【说站】java静态和动态绑定的对比
- 【说站】java稀疏数组是什么
- 【说站】java如何检查内存泄漏
- 【说站】java内存泄漏
- 【说站】java方法重载
- 【说站】java内存泄漏的解决方法
- 【说站】java多态的理解
- 【说站】java数据结构
- 【说站】java程序编好了怎么运行
- 【说站】java中不同变量的区别
文章评论
评论问答