当前位置: 首页 > news >正文

泛型擦除是什么

//在编译阶段使用泛型,运行阶段取消泛型,就是擦除.
//因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除,
//擦除是将泛型以其父类代替,如String变成了object等.
//在使用的时候还是进行带强制类型转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性;
//ArrayList<Integer> l1 = new ArrayList();ArrayList<String> l2 = new ArrayList();System.out.println(l1.getClass()==l2.getClass());
//泛型信息只存在于代码编译阶段,但是在java的运行期(已经生成字节码文件后)与泛型相关的信息会被擦除掉,专业术语叫做类型擦除
//因为ArrayList <String>和ArrayList <Integer>在 jvm 中的 Class 都是 List.class,二者在 jvm 中等同于List<Object> 。

ArrayList<String> l=new ArrayList<String>(); l.add("abc"); l.add(123);

l.add(123)无法编译通过,因为123不是String类型,这也是使用泛型的好处之一。

理解了泛型擦除的原理,我们可以巧妙地利用这个原理结合反射知识干一些“坏事”,例如:

ArrayList<String>l=new ArrayList<String>(); l.add("abc");    try { Method method = l.getClass().getDeclaredMethod("add",Object.class); method.invoke(l,"test"); method.invoke(l,100.f); }catch (Exception e) { e.printStackTrace(); } System.out.println("list的大小是:"+l.size());  for ( Object o: l){ System.out.println(o); } 
list的大小是:3 abc test 100.0(被成功插入到ArrayList中) 

可以看见100.0 成功地插入到ArrayList <String> 中了,所以利用类型擦除的原理并结合反射的手段就绕过了正常开发中编译器不允许的操作限制。

我们可以将泛型比作是一个看守,他来守护我们的代码安全,然后设置各项规定,“xxx 禁止出入”的提醒。而现实生活中,也总会有些人能够基于对门卫们生活作息的规律,绕开他们的监视(反射结合泛型擦除)来干一些坏事儿 。

http://www.lryc.cn/news/230509.html

相关文章:

  • 7、线性数据结构-切片
  • linux grub2 不引导修复 grub2-install:error:/usr/lib/grub/x86_64-efi/modinfo.sh
  • 建筑楼宇智慧能源管理系统,轻松解决能源管理问题
  • 【洛谷算法题】P5711-闰年判断【入门2分支结构】
  • ArcGIS10.8 连接 PostgreSQL 及遇到的两个问题
  • 深入跨域 - 从初识到入门 | 京东物流技术团队
  • WebSocket真实项目总结
  • Python 如何实现解释器(Interpreter)设计模式?什么是解释器设计模式?
  • 单片机与PLC的区别有哪些?
  • 修改浏览器滚动条样式--ios同款
  • python自动化测试selenium核心技术3种等待方式详解
  • 苹果手机照片如何导入电脑?无损快速的传输办法分享!
  • csh 脚本批量处理文件并将文件扔给程序
  • 程序员技能成长树,程序员的曙光
  • 灰度图处理方法
  • 微信小程序:仅前端实现对象数组的模糊查询
  • 【done】剑指offer63:股票的最大利润
  • 桶装水订水小程序app,线上预约订水更便捷
  • 解决进程同步与互斥的Dekker算法与Peterson算法
  • confluence无法打开空间目录
  • python用pychart库,实现将经纬度信息在地图上显示
  • Android Studio的笔记--随机数
  • 《诗经》中28首巅峰之作
  • 十大适合外贸企业邮箱的Gmail替代品推荐
  • 在Python中使用sqlite3进行数据持久化操作
  • file2Udp增量日志转出Udp简介
  • 快速创建1个G的文件 -----window平台
  • LeetCode【33】搜索旋转排序数组
  • 若依系统富文本框上传图片报错!
  • Azure 机器学习:MLOps - 使用 Azure 机器学习进行模型管理、部署和监视