专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

互联网大厂面试什么是Java语言中的类型擦除?

  什么是泛型?
  首先来讲泛型操作是从JDK5开始引入Java语言的一个新特性,其允许在定义类或者是接口的时候使用一个类型参数,并且这个类型参数可以在使用的时候被替换成一个具体的参数。使用泛型最大的好处就是可以极大的提升代码的复用性。
  以List为例,我们可以在List集合中放入任何的数据类型例如String、Integer等等,当然也可以放入对象类型。如果不使用泛型那么就会出现想要使用String类型的List集合的时候需要定义一个String类型的List集合,需要使用Integer类型的List的集合的时候就需要定义相应类型的集合,这样做就有点复杂了,为了解决这样的问题,就出现了我们的泛型操作。各种语言对泛型操作的处理机制?
  通常情况下,编译器需要通过如下的几种方式来对泛型数据类型进行处理。在实例化一个泛型类或者是一个泛型类型的方法的时候,对于每一种数据类型都产生一份新的代码来进行具体的支撑,例如针对List的泛型操作,如果使用了String类型,就生成一份String类型的List代码,使用Integer就生成一份Integer的List代码。对于每个使用泛型操作的类或者方法来讲生成的代码都是唯一的一份,并且将所有的类型通过映射都映射到泛型上,在需要具体使用的时候对类型进行判断进行转换,使得泛型能够正常的操作。
  在C语言中的泛型就是通过第一种方式来实现的,也就是说C语言的编译器会为每个泛型都生成一份对应的执行代码,在代码中String类型与Integer类型对应的泛型类是不一样的。而这样带来的后果就是在编译后的代码中会存在大量的冗余代码。
  在C语言中泛型操作无论是在源码中还是在编译后的中间代码中或者是在运行时期的代码中都是存在不同类型的数据代码,唯一不同的是这些代码是在运行期间生成的,并且有自己的虚地址表示,这种方式被称为是类型膨胀。而基于这种方式所实现的泛型操作被称为是真实泛型。
  在Java语言中的泛型与前面两者是不一样的,它只在源代码中存在,在编译之后的字节码中就会被替换成原生类,并且在相应的代码中加入了强制类型转换。所以对于Java语言而言,ArrayList和ArrayList其实就是同一个类型,对于Java来讲泛型操作可以称之为Java语言的优势,而在Java语言中使用到的对泛型的操作则是被称为是类型擦除,而基于这种方法实现的泛型操作被称为是伪泛型。
  C和C是使用Codespecialization的处理机制,前面提到,他有一个缺点,那就是会导致代码膨胀。另外一个弊端是在引用类型系统中,浪费空间,因为引用类型集合中元素本质上都是一个指针。没必要为每个类型都产生一份执行代码。而这也是Java编译器中采用Codesharing方式处理泛型的主要原因。
  Java编译器通过Codesharing方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类型实例映射到唯一的字节码表示是通过类型擦除(typeerasure)实现的。什么是Java语言的类型擦除?
  什么是类型擦除?类型擦除是指通过类型参数组合的方式,将泛型类型的实例对象关联到同一份字节码文件上。编译器最终只会为泛型类型提供一份统一的字节码,并且将相关的实例对象关联到这一份字节码文件上。
  类型擦除的关键就是在于从泛型类型中清除类型参数的信息,并且在使用的时候需要对传入的真实参数进行类型检查和类型转换。可以简单的理解为将泛型类型的代码转换成了普通类型的代码,只不过对于Java编译器来讲,是将对应的字节码文件进行了转换。
  类型擦除器过程主要分为如下两个步骤将所有的泛型有关的参数用最顶级的父类进行替换移除所有的具体类型相关的参数Java语言泛型处理过程
  首先来看一段简单的代码publicstaticvoidmain(String〔〕args){MapString,StringmapnewHashMapString,String();map。put(name,nihui);map。put(age,22);System。out。println(map。get(name));System。out。println(map。get(age));}
  经过反编译之后的结果如下publicstaticvoidmain(String〔〕args){MapmapnewHashMap();map。put(name,nihui);map。put(age,22);System。out。println((String)map。get(name));System。out。println((String)map。get(age));}
  从反编译的结果来看,我们对于KV键值对的处理都已经不存在了,只留下了我们想要实现的部分的代码,就是直接进行类型的存储。interfaceComparable{publicintcompareTo(Athat);}publicfinalclassNumericValueimplementsComparableNumericValue{privatebytevalue;publicNumericValue(bytevalue){this。valuevalue;}publicbytegetValue(){returnvalue;}publicintcompareTo(NumericValuethat){returnthis。valuethat。value;}}
  反编译之后的结果interfaceComparable{publicintcompareTo(Objectthat);}publicfinalclassNumericValueimplementsComparable{publicNumericValue(bytevalue){this。valuevalue;}publicbytegetValue(){returnvalue;}publicintcompareTo(NumericValuethat){returnvaluethat。value;}publicvolatileintcompareTo(Objectobj){returncompareTo((NumericValue)obj);}privatebytevalue;}
  编译之前的代码publicclassCollections{publicstaticAmax(Collectionxs){Iteratorxixs。iterator();Awxi。next();while(xi。hasNext()){Axxi。next();if(w。compareTo(x)0)wx;}returnw;}}
  反编译之后的代码publicclassCollections{publicCollections(){}publicstaticComparablemax(Collectionxs){Iteratorxixs。iterator();Comparablew(Comparable)xi。next();while(xi。hasNext()){Comparablex(Comparable)xi。next();if(w。compareTo(x)0)wx;}returnw;}}
  第2个泛型类Comparable擦除后A被替换为最左边界Object。Comparable的类型参数NumericValue被擦除掉,但是这直接导致NumericValue没有实现接口Comparable的compareTo(Objectthat)方法,
  于是编译器在其中添加了一个桥接方法。从第3个示例中限定了类型参数的边界A,A必须为Comparable的子类,按照类型擦除的过程,先讲所有的类型参数ti换为最左边界Comparable,然后去掉参数类型A,得到最终的擦除后结果。泛型带来的问题有哪些?
  一、泛型方法的重载publicclassGenericTypes{publicstaticvoidmethod(ListStringlist){System。out。println(invokemethod(ListStringlist));}publicstaticvoidmethod(ListIntegerlist){System。out。println(invokemethod(ListIntegerlist));}}
  从上面这段代码中我们可以看到两个方法由于参数类型不同形成了方法的重载,但是这段代码在实际编译的过程中是没法通过的,因为在之前的内容中我们提到过List和List在Java语言来看由于类型擦除会将其认定为同一个类型,这样就会变成两个参数一样并且方法名一样的方法,这个在Java操作中是不被允许的。
  二、遇到Catch
  我们都知道在Java语言中会经常遇到异常捕获,如果我们在开发过程中自定义了一个通用的异常处理,那么就会有各种各样的异常被通用的异常处理捕获,这个时候如果想要实现不同的异常进行不同的处理那就非常难了
  三、当泛型类型包含静态变量publicclassStaticTest{publicstaticvoidmain(String〔〕args){GTIntegergtinewGTInteger();gti。var1;GTStringgtsnewGTString();gts。var2;System。out。println(gti。var);}}classGTT{publicstaticintvar0;publicvoidnothing(Tx){}}
  如上面代码所示,如果在泛型中遇到的静态变量,会出现什么样的结果呢?我们都知道静态变量是与类的存在是有关的,也就是说对于一个泛型如果与到了一个静态变量,那么这个静态变量就是对于所有的泛型类所共享的。而上面的代码执行结果也就显而易见了。输出的结果应该是2。因为对于第一个操作来讲,将泛型中的静态变量改成了1,但是由于静态变量是共享的,在第二个操作中就会将对应的值改成2,所以最终的输出结果应该是2。总结
  综上所述,在虚拟机中没有泛型的概念,只有普通类与普通方法的概念,所有泛型类型在编译之后都会被进行类型擦除操作,也就是说泛型并没有自己独立存在的对象进行存储,也就不会有反射等一些高级操作。在使用泛型操作的时候一定要提前的去对类型做处理让编译器提前就知道需要处理的类型的是什么。这样可以在提升编译器处理效率的同时也可以避免带来各种各样的问题。

iPhone11到底值不值得升级ios16。1亲身实践,亮出答案值得!根据这两天的使用情况,确实是值得升级的。从iOS15。3升级到ios16。1,版本跨度还是挺大的。但是好在升级结果没有让我失望。我就从以下几个方面,根据自身傅蔚冈供销社归去来兮?关键是要和其他市场主体一起竞争文丨傅蔚冈(上海金融与法律研究院研究员)2010年,人民网退出人民搜索,乒坛名将邓亚萍出任人民搜索网络股份有限公司总经理。但是人民搜索只运行了3年就黯然下线,目前在网上几乎找不到的新款特斯拉ModelSXPlaid实拍终于等到你太平洋汽车新车频道11月5日,特斯拉官方携S3XY全家族车型特斯拉机器人能源架构超级工厂等最新科技套装亮相11月5日10日在上海举办的第五届中国国际进口博览会(以下简称进博会),在摩托罗拉Razr2022评测全力以赴地推出翻盖式可折叠产品经过一段时间的中断后,摩托罗拉继续在可折叠翻盖市场上努力。摩托罗拉Razr2022是该系列中的最新款,毫无疑问,它是其中最精美的设备。它已经正式发布了两个月左右,最近也收到了国际版关于杨元庆做的这些,你有啥想说的?据联想近年相关报告显示,联想在ESG规划环境领域做出了目标承诺,到2030年,其将实现公司运营性直接及间接碳排放减少50以及部分价值链的碳排放强度降低25,并在2050年底之前实现勇士补强,路在何方?勇士遭遇5连败,创20年开赛之初最差战绩,作为卫冕冠军,无论是俱乐部及勇士队上下都压力巨大,替补羸弱之问题,无论是主教练科尔,还是当家球星库里,都已十分不满,俱乐部已到不得不解决之腹泻(拉肚子)患者的陪护要点腹泻是一种常见症状,我们俗称拉肚子。通常是指排便次数突然增多,超过平时习惯的频率,并且粪便稀薄,水分增加,每日排便量超过200g,或含未消化食物或脓血黏液。腹泻常伴有排便急迫感肛门供销社又火了!坊间热议多地为何恢复重建?将起何作用?近日,供销社成为热门话题。人们争相讨论之余,在资本市场上,供销社概念也持续走强。在多地已淡出人们视野的供销社,为何会突然受到关注?供销社的前世今生近期,湖北日报报道称,湖北省实施基吃姜不去皮,吃错一生疾?生姜到底要不要去皮?告诉你答案砰啪,小安的妈妈正在案板上拍扁了一块姜,打算切成姜末,旁边的小安正在洗手台上洗水果,看到这一幕问道,诶,妈你咋不去皮呀?吃姜去不去皮都一样的,前几天那个削皮刀坏掉了,干脆就不削了。象棋入门一学就会,马的走法和吃子方法,棋博士说马媒体人周刊今天我们学习马的走法。马和车一样,可进可退,但是它不是沿着直线走,而是跳跃着走,从一个交叉点跳到另一个对角的交叉点上。我们可以用两种方法来记住马的走法第一种是,走马如同英铝碳酸镁咀嚼片的功效与作用铝碳酸镁咀嚼片作为消化系统疾病常用的药物,是抗酸药的一种,具有抗胃酸的作用,并兼有胃黏膜保护作用,同时对胆汁酸也有一定的吸附作用。所以说铝碳酸镁咀嚼片是一个抗酸抗胆汁的胃粘膜保护剂
小人物挑大梁!男篮4年前打哈萨克斯坦他一人送出6次助攻世预赛第4个窗口期首场比赛开打前,中国男篮被认为能轻松击败哈萨克斯坦。从比分上看,中国男篮赢得很轻松,6856赢了13分。但比赛过程并非如此,中国男篮赢得很艰难。第三节,哈萨克斯坦一哥升级做大哥!张本智和再回老家,肩上扛了整个日本男团一年多前,东京奥运会男团铜牌争夺战,水谷隼一锤定音,日本男团铜牌落袋。场边的张本智和飞驰过挡板,拦腰抱住高举双手迎接全场欢呼的水谷隼。赛后新闻发布会,水鸟老师再申退意,小摩托动情挽国乒14人惨遭淘汰!日本女单全军覆没,张本美和爆冷一轮游北京时间8月26日凌晨,乒乓球WTT捷克赛结束了首个正赛日的较量,目前国乒已经有多达14人在单打比赛中出局,双打也新增1对组合输掉外战,而且连续被卢森堡选手(非倪夏莲)突破,令人大10月起,电动车价格战开打,降幅5001600,雅迪爱玛台铃出手请您在阅读前,先点击上面的关注。感谢您的支持,我们将为您带来更多有价值的内容。电动车行业一直有着金九银十的说法,作为传统旺季,每年这个时间各大品牌都会火力全开,包括推出新品车型,加汉兰达的价格,能买近5米长的进口SUV!现代新款帕里斯帝变更香?帕里斯帝是进口现代引入国内的一款旗舰级别的SUV,车长近5米搭载了3。5LV6引擎,它应该是我们目前能买到的,为数不多依旧搭载大排量自然吸气的中大型SUV这是一台在北美销量非常好的最幸运的不幸者阿雪上医科大学时,我们寝室里一共六个室友,除我和晓静之外,其余四个,阿雪阿汪阿桂燕儿都是江城的,阿雪和阿汪跟其它寝室好多人初中高中时还是同校同班呢。阿雪是一个略矮于中等个子,但五官端正天风研究四季度A股可沿两点思路布局核心观点1思路一低估值蓝筹的日历效应,但需要满足一定条件。四季度日历效应是否有效,取决于中长期贷款增速能否趋势性回升。如果长期贷款增速上行,或者宏观预期明显改善,那么大金融板块往往21!创纪录!中国女足王牌完成欧冠首秀,大巴黎期待闪耀正文近期结束的欧冠第二轮资格赛首回合较量中,巴黎圣日耳曼女足21绝杀赫根女足。此役,中国女足王牌李梦雯替补登场完成个人欧冠首秀,对此,大巴黎官方微博赛后发文鼓励李梦雯期待闪耀!谈到苹果宣布印度工厂开始组装iPhone14全球果链分布出现新格局财联社9月26日讯(编辑史正丞)消费电子龙头苹果公司周一对媒体确认,苹果供应链即将在印度工厂组装本月刚刚发布的iPhone14系列。由于此前印度工厂仅生产旧型号的苹果产品,这一变化抢煤油气过寒冬,全球能源格局大洗牌一hr表面上看,美俄是死敌,就差互相扔核弹。双方找了个折衷的地方欧洲大粮仓乌克兰交锋。在能源生意上,我一直怀疑美俄是有默契的,尽管美国的制裁疯狂到极限,但偷摸购买俄罗斯的石油天然气因为相遇,我们有了故事郝有花(图片来自网络)你静静地站在那儿我默默地站在这儿我们都在回忆,母校的欢乐时光带香味的文字在红叶飘散的秋天里一泻千里,如洪水奔涌而至儿时的伙伴,各奔东西归来时,岁月染白青丝相见
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网