博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java中的伪泛型---泛型擦除(不需要手工强转类型,却可以调用强转类型的方法)...
阅读量:6709 次
发布时间:2019-06-25

本文共 1397 字,大约阅读时间需要 4 分钟。

Java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据。

使用反射可以破解泛型T类型,如下:

ArrayList
array=new ArrayList
(); array.add(1);//这样调用add方法只能存储整形,因为泛型类型的实例为Integer array.getClass().getMethod("add", Object.class).invoke(array, "asd"); //通过反射可以加入字符串类型 反射的使用:根据类名、方法名以及方法对应的参数,获取方法,并实现方法的调用。 调用getMethods方法输出的是自身的public方法和父类父接口的public方法。 调用getDeclaredMethods方法输出的是自身的public、protected、private、default方法。

 

泛型擦除概念:

声明时的泛型擦除处理机制:

编译成.class文件时,会将.java文件中泛型做一些特殊处理:将类的泛型T去掉,将类中方法中的泛型T(方法参数和返回值T)变成Object,看下边例子,你就秒懂

//类中方法上的泛型 public T set(int index, T element) {public set(ILjava/lang/Object;)Ljava/lang/Object;
//类上的泛型 public class FXClass
implements List
{public class com/example/zs/fanxing/FXClass implements java/util/List {

引用时的泛型擦除处理机制:

FXClass
list1 = new FXClass
(); list1.add(new Integer(10)); list1.add(new Integer(20)); Integer a =list1.get(0);//这行对应的字节码指令如下: INVOKEVIRTUAL com/example/zs/fanxing/FXClass.get (I)Ljava/lang/Object; CHECKCAST java/lang/Integer//这句指令的出现是因为源代码中使用了 (Integer a =) 划重点,个人理解:

 1)get(0)获得的是Object类型,但是编译器看到我们把Object类型赋值给了整形a,所以会生成一条指令CHECKCAST,

运行时会检查Object能不能转成Integer类型,并且这条指令会抛异常呦。

 2)get(0)并没有手动强转Integer,但编译器却可以调用Integer的方法。

 

 

 

转载于:https://www.cnblogs.com/hongchengshise/p/10556247.html

你可能感兴趣的文章
在用网站ICP备案主体变更导致网站无法访问问题解决
查看>>
js闭包实例汇总
查看>>
“Asp.Net微型服务器”根据博友们的要求改版了,也出.NET4.0版本了,要更新的博友们赶快下吧...
查看>>
一起谈.NET技术,系统架构技能之设计模式—代理模式
查看>>
搭建zookeeper单机版以及简单命令的使用
查看>>
来自docker的嚎叫
查看>>
概率密度
查看>>
LYNC2013介绍和基础架构准备角色
查看>>
python 异常处理
查看>>
GIL全局解释器锁
查看>>
Apache2.4使用require指令进行访问控制--允许或限制IP访问/通过User-Agent禁止不友好网络爬虫...
查看>>
PH_Pooled Featrues Classification MIREX 2011 Submission
查看>>
go中的线程的实现模型-P G M的调度
查看>>
zoj Gao The Sequence
查看>>
python单例模式的实现
查看>>
laravel3中文文档是迈入laravel4的捷径
查看>>
白钰铭的第五次作业
查看>>
读取日志文件,搜索关键字,打印关键字前5行。yield、deque实例
查看>>
(转载) ExtJs大比拼JQuery:Dom文档操作
查看>>
使Android开发方便快捷的8个好工具
查看>>