Java泛型擦除的原理分析

1、说明

在编译过程中,可以获得类型变量的信息。因此,set方法可以在编译器中进行类型检查,非法类型不能通过编译。但是对于get方法,由于擦除机制,操作时的实际引用类型是Object类型。

为了恢复返回结果的类型,编译器在get后添加了类型转换。因此,在genericHolder.class文件main方法主体的第18行有类型转换的逻辑。这是编译器自动添加的。

因此,我们处理了泛型对象的读写位置,并对代码添加了限制。

2、实例

//GenericHolder.java
publicclassGenericHolder<T>{
Tobj;
publicTgetObj(){
returnobj;
}
publicvoidsetObj(Tobj){
this.obj=obj;
}
publicstaticvoidmain(String[]args){
GenericHolder<String>holder=newGenericHolder<>();
holder.setObj("Item");
Strings=holder.getObj();
}
}

//GenericHolder.class
publicclassGenericHolder<T>{
Tobj;

publicGenericHolder();
Code:
0:aload_0
1:invokespecial#1//Methodjava/lang/Object."<init>":()V
4:return

publicTgetObj();
Code:
0:aload_0
1:getfield#2//Fieldobj:Ljava/lang/Object;
4:areturn

publicvoidsetObj(T);
Code:
0:aload_0
1:aload_1
2:putfield#2//Fieldobj:Ljava/lang/Object;
5:return

publicstaticvoidmain(java.lang.String[]);
Code:
0:new#3//classGenericHolder
3:dup
4:invokespecial#4//Method"<init>":()V
7:astore_1
8:aload_1
9:ldc#5//StringItem
11:invokevirtual#6//MethodsetObj:(Ljava/lang/Object;)V
14:aload_1
15:invokevirtual#7//MethodgetObj:()Ljava/lang/Object;
18:checkcast#8//classjava/lang/String
21:astore_2
22:return
}

以上就是Java泛型擦除的原理分析,希望对大家有所帮助。更多Java学习指路:Java基础

原文来自:https://www.py.cn
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容