城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

什么是类型擦除?

5月25日 飞凤谷投稿
  泛型在很多编程语言中都存在,而Java中的实现方式最为独特,Java的泛型只存在于源码阶段,在编译期会被擦除。具体来说,Java编译器会将类型参数替换为其上界(upperbound,在Java中即类型参数中extends子句的类型),如果上界没有定义,则默认为Object。为了实现泛型做了什么?隐式转换
  为了保证类型安全,会插入显式类型转换,示例如下:编译前ListBookbooksgetBooks();for(Bookobj:books){book。type();}编译后ListbooksgetBooks();for(Objectobj:books){类型转换,编译期自动生成的Bookbook(Book)book。type();}桥接方法
  为了保证多态性,会生成桥接方法,示例如下:源代码publicclassPeopleT{voidset(Tt){}}publicclassManextendsPeopleString{Overridevoidset(Stringstr){dosomething}}编译后publicclassManextendsPeople{voidset(Stringstr){dosomething}桥接方法,编译期自动生成的voidset(Objectstr){set((String)str);}}为什么要引入泛型?
  Java在jdk5引入泛型其中一方面是为了解决集合遍历时候总是需要手动强制类型转换的问题,如下面代码一样:ListbooksgetBooks();for(Objectobj:books){所以这里总是需要强转Bookbook(Book)book。type();}
  但泛型的引入又导致jvm不能向下兼容,由此而搞了个类型擦除,但是类型擦除又引入了一系列的问题,我们接着看。类型擦除带来的恶果
  类型擦除带来了一系列的不良后果,这也间接导致了后续Java版本用更多的实现代码来弥补这些不良后果。反射困境
  由于泛型信息在编译时被擦除,因此在运行时,无法获取泛型信息。这使得开发者无法在运行时获得泛型类型,这对于一些需要动态获取泛型信息的框架和工具来说是一个很大的问题。相关框架为了能够获取到泛型类型信息,这些框架和工具都是通过反射和其他机制来实现动态获取泛型信息的。例如:Fastjson:阿里巴巴开发的JSON库,提供了TypeReference类,可以动态获取泛型信息,Jackson与Gson也有类似实现。Java8TypeTools:提供了GenericTypeReflector类,可以动态获取泛型信息。SpringFramework:Spring提供了ParameterizedTypeReference类,可以动态获取泛型信息。类型数量爆炸
  熟悉Java的同学有没有很奇怪一件事,Java8内置的函数式接口为什么会有Supplier、Function和BiFunction之分?为什么不是Function、FunctionT,R、FunctionT1,T2,R呢?因为Java没法用泛型的个数来区分类型,从而导致需要定义更多的类型来区分,还美其名曰为了增加可读性。对基本类型不友好
  泛型不支持基本类型,由于运行时泛型会被擦除,导致运行时无法计算泛型类型所需要的内存大小,为了解决这个问题,Java设计者们又想了个歪主意,泛型只能使用引用类型,因为不管什么类型的引用占的内存大小都是一样的,但是基本类型大小不一。
  但是通过规范解决了这个问题,又引入了新的问题,我们要向一个集合中添加基本类型怎么办?谜之操作来了,定义所有基础类型的包装类型(int与Integer、long与Long等等),这又引入了一大堆新的实现和概念,例如自动装箱拆箱。忍不住多吐槽一下,自动拆箱引起的npe让代码写起来非常丑陋和冗余,如下:IntegertyperemoteService。getBookType();这里不判空,自动拆箱可能就npe了if(type!nulltype1){dosomething}
  为了让函数式接口能够支持基本类型,例如Function,如果你要返回int,则你需要IntFunction,那是不是还有DoubleFunction、LongFunction、DoubleToLongFunction、LongToIntFunction等等,如你多料,java。util。function下还有几十个类似的函数式接口,然而这还不是全部基本类型,很多基本类型还需要自己实现。
  各种各样的函数式接口
  总之,Java设计师们一味的向下兼容,导致了Java的泛型就像是一个怪胎,完全是为了拥有而拥有,C与C的实现方案完全优于它,恨铁不成钢啊,当然作为一个javaer,我仍然希望Java能够长足发展,期待未来的改变。
  我是搬长,如果文章给你带来了收获,请关注点赞,你的支持是我最大的动力!
投诉 评论 转载

什么是类型擦除?泛型在很多编程语言中都存在,而Java中的实现方式最为独特,Java的泛型只存在于源码阶段,在编译期会被擦除。具体来说,Java编译器会将类型参数替换为其上界(upperbou……我说话直,你不要介意拳头只有收回来,打人才能打得疼。如果一个人不明白,藏巧于拙,以屈为身的道理,就必然会急于求成,不讲策略与方式,这样必将限制才华的发挥,影响一生的前途和命运。该……寿命长短,牙齿先知?60岁的人,牙齿剩多少颗正常?可能对于年轻人来说,对长寿没有一定的概念和想法。但是对于中老年人来说,长寿这个话题往往吸引着他们,但要知道一个人的寿命长短受遗传、饮食、环境等众多因素影响,不是我们可以左右的。……时尚盛典红毯倪妮夸高叶超美,孟佳害羞频捂胸,张天爱不耐烦2月25日,万众瞩目的时尚盛典,在大家的期待中拉开了序幕,众女星的出场,让这场盛典,有了百花齐放,姹紫嫣红的既视感。凭借《狂飙》中大嫂一角而爆红的演员高叶,在此次盛典中,……相约大冶共赏春色湖北日报讯(通讯员宋露露)粉桃画保安,梨雪铺仙桥;桃园玫瑰红,金湖生铜草;春到江南时,才道春光好;何处赏花香,一城冶花娇。走进大冶的春天里,一幅万花齐放的盛景让无数游客为之沉醉……拉肚子怎么吃?先生吃了寒凉的东西,开始拉肚子,挺厉害的,全是稀的,一个下午晚上跑了七八次厕所。给老妈说,老妈给了一个饮食方法,马上见效,很快就止住了。很简单:红糖姜片大蒜红糖指带……Omdia2029年AMOLED渗透率将达到显示面板总量的3智通财经APP获悉,根据Omdia《显示驱动芯片市场追踪报告》2022年第三季度分析,2022年OLED显示面板出货量仍年同比下降6,而OLED显示驱动芯片(DDIC)出货量年……被低估OPPO的手机,12GB256GB跌到2289元,拍照有很多手机刚上市时没有多少人关注,甚至不受待见,但是一经开售后销量非常好,核心原因并不是用户不懂这手机,或是被厂商给营销了。实际上这些手机的基础体验还是很棒的,而且亮点也很突出……姹紫嫣红的春天济南2023年3月28日:祝福大家:吉祥安康!济南英雄山风景区,瞻英阁楼旁的桃花正在盛开,随拍了几张环山路沿途美景,和桃花朵朵开的图片,发上来给大家欣赏欣赏。瞻英……发布原创设计品牌!广州技校踏上广东时装周舞台意式浪漫风情与传统东方韵味相结合,会产生怎样的奇妙效果?3月23日,广州市工贸技师学院(以下简称广州工贸)踏上广东时装周舞台,在2023广东时装周春季上发布了产教融合原创设计品……为什么好多人说武汉黄鹤楼是假的?钢筋混凝土建筑,还有电梯这里是刘小顺的旅行和生活研究所。武汉,是湖北省的省会,位于我国的华中地区,也是一座历史悠久、人文底蕴深厚的著名旅游城市,每年都会吸引大量游客前来游玩。说到武汉最有代……逾80万保险代理人流失背后六大上市险企寿险改革成色几何?中新经纬4月4日电(李自曼)截至3月31日,中国平安、中国人寿、中国太保、中国人保、新华保险、中国太平6家上市险企均已披露2022年年报。行至2022年,中国寿险行业改革……
来赴一场远古生物诉说的科普盛宴乐府新声主要内容简介及赏析房子将直面贬值潮?内行人预测今明两年的房价或超乎想象微信曾经给过授权,但你已经删除的app,记得要去解除授权你是我生命中的过客勒布朗詹姆斯的耐克鞋款有迈阿密热火队配色转弯造句用转弯造句大全如何护理患支气管哮喘的宝宝实例分析种看不懂的活动文案连裁三人!湖人152大名单出炉三分奇兵获新约,小皮蓬成功留队上市即破发!零跑汽车,抹黑赛道?湖北省房县青峰大裂谷景区若谷厅石雕平安有福

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁