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基础
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容