游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

互联网大厂面试什么是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。总结
  综上所述,在虚拟机中没有泛型的概念,只有普通类与普通方法的概念,所有泛型类型在编译之后都会被进行类型擦除操作,也就是说泛型并没有自己独立存在的对象进行存储,也就不会有反射等一些高级操作。在使用泛型操作的时候一定要提前的去对类型做处理让编译器提前就知道需要处理的类型的是什么。这样可以在提升编译器处理效率的同时也可以避免带来各种各样的问题。

爱情随笔(三)人都说,爱上一座城,是因为城中住着你爱的人。爱屋及乌自是不言而喻,每个人的生命中都会出现这样一个人,纵使尘满面,鬓如霜,也想要和他相伴到岁末晚景。我深信此画面曾被无数人精心描摹……太监大小的各种称谓无非,大大小小的太监,在炎天都市穿葛布箭衣,系上白玉钩黑带。太监头子,都市收大大小小的门徒。放工后,端茶送水、洗衣打扇,都是门徒理当做的事。内侍阉工钱五品,执事太监……听见平安是你我共同的心愿平安是什么?平安是福,平安是金。平安,是亲人的问候;平安,是友人的祝福。平安是拂过秦岭山林初绿的春风,平安是洒落在永宁门御道的秋雨,平安是夏日流淌在灞河……徐峥与张庭夫妇无直接股权关联据媒体报道,近日,多位网民留言不建议艺人徐峥作为嘉宾参加《青春环游记》节目,对此,浙江广电回复称,徐峥并未涉及张庭夫妇传销案,未被定性为劣迹艺人,邀请徐峥作为节目嘉宾已获批。……春节吃喝动各记住1个字,健健康康过春节健康时报权威健康资讯,因专业而信赖!快过年了,家里要张罗起来了。忙碌了一年,谁不想开开心心舒坦几天?但如果一直盲目地吃、喝、躺,会让身体苦不堪言。春节期间吃、……加快推进中医学术活态传承视频加载中。。。国家卫生健康委9月23日召开新闻发布会,介绍党的十八大以来中医药科技创新和走出去有关情况。国家中医药管理局科技司司长李昱介绍,加快推进中医学术活态传承,对……印度会被ChatGPT冲击?大国要崛起可不是那么容易的你好,我是王煜全,这里是王煜全要闻评论。最近摩根大通出了一份关于ChatGPT的报告,切入角度很有意思,他们认为ChatGPT将会极大的改变编程、客服等IT外包领域。随着……如何评价国民政府江苏省主席韩德勤?从历史上看,韩德勤一生追随蒋介石,指挥作战能力一般,先败于红军,又败于新四军,两次都当了俘虏,但在抗战中,坚持苏北抗战,还是有一定功劳。洋河镇,因洋河酒而著名。韩德勤18……抗美援朝精神永存不朽《长津湖》电影很难再现抗美援朝的残酷真实。个人观点,长津湖电影已经是中国电影各方面进步的一个事实,尽管有各种遗憾和纰漏,都不能抹除国产大片的进步,这里不做细谈。一直……江苏省徐州宿迁淮安3地级市最新县级政区简介苏西北3市:徐州市、宿迁市、淮安市徐州市尧封彭祖于今市区所在地,为大彭氏国,徐州自此称彭城。秦置彭城县,西汉设彭城郡,东汉设彭城国、建都彭城。三国时,曹操迁徐州刺史……地球上的水来自哪里?海洋有丰富的水资源为什么科学家探索一颗星球的时候首先要寻找它有没有液态水呢?因为存在液态水,就证明这颗星球很可能就存在过生命,不过至今为止,我们人类还没有在任何一颗星球发……释小龙的悲哀当红童星被时代抛弃时,连声招呼都不会打《旋风小子》《新乌龙院》应该算是我们这代人的童年记忆,可主演们的近况却让人唏嘘。林志颖口碑崩塌,吴孟达去世,郝邵文也在昨日宣布结婚。其中最让人感叹的还是释小龙,最近……
老秀才一句话惊出红军将领一身冷汗,毛主席立即下令飞夺泸定桥前文说道,中央红军来到了大渡河畔,由于民族政策和统战工作到位,毛泽东并没有成为蒋介石口中的石达开第二,但是面对大渡河的惊涛骇浪,如何顺利渡河仍旧是困扰红军的一个重大难。所以说,……日本女护士嫁给中国将军64年,生下歌唱家女儿,女婿更是家喻户近代史上,日本人在中国犯下无数罪行,导致近些年中国人对日本人还是没有什么好感,但在战争时期也不是所有日本人人都是无恶不作的坏人。曾经有一位日本女护士就嫁给了一位中国将军,……深宫的花花太岁王曾瑜河南文艺出版社赵构在皇宫和康王府中无忧无虑地度过了他最初的十九年光阴,从一个不知世事的婴儿,成长为残虐的花花太岁。王曾瑜王曾瑜,1939年生,中国社会科学院荣……排球功勋教练袁伟民陈忠和郎平的成就与地位,怎么评价?这是东奥后与一位球迷私下交流时她提出的问题。以下是我的回答〔1〕:这三位都是神。中国人喜欢神、崇拜神。一、袁伟民是传奇,是永远的神。他带领中国女排首取三连冠、……1990年詹才芳将军83岁寿辰,妻子回忆50年前的事,至今我前言詹才芳,1907年出生于湖北省黄安(今红安)县。1955年被授予中将军衔,于1992年逝世。1990年初秋的一个星期日,为了庆祝詹才芳将军的83岁寿辰,也为了他……寻找2023河南新地标丨安阳百年纱厂蝶变新潮文旅小镇唤起一座策划:城市运营集群编者按:一个地方的地标,往往也是经济晴雨表。在新时代发展理念指引下,近年来,我省各地坚持项目为王,实施十大战略,锚定高质量经济发展方向,涌现出一大批新的……长发不是女生专利,这三个男星留起长发,非但不娘反而帅气逼人长发一般来说都是女生的专利,长发飘飘,自带仙气。但有些男明星硬是靠着俊朗的外形轻松HOLD住了长发,不仅不娘,还硬朗帅气。长发对于他们来说,甚至是加分项。下面就来扒一下我心目当……中国电信中国移动被美列入不可信供应商清单?商务部回应点蓝字关注,不迷路3月31日,商务部召开例行新闻发布会。商务部新闻发言人束珏婷介绍了中葡论坛部长级特别会议有关情况,并就美国称将更积极地向中国施压,中国电信美洲公司和中国……资讯芯驰科技获近10亿元B轮融资,已与上汽集团开展深度合作文:懂车帝原创李德喆〔懂车帝原创行业〕据36氪消息,11月28日,芯驰科技完成近10亿元B轮融资。本轮融资由上汽金石创新产业基金战略领投,中信证券投资、江苏金石交通科技产……勃列日涅夫独揽104枚勋章,被称勋章之王,获吉尼斯纪录若论苏联何时算作全胜,便是七十年代勃列日涅夫的统治时期,美国军事彻底被苏联压制,世界军事领域打开新的局面,美苏争霸开启,军备竞赛日益紧张。勃列日涅夫因成绩卓著得到无数赞美,而每……蒙古人如何处理被俘的俄罗斯女孩?一个人最大的快乐就是打败敌人,把他们赶在他面前,夺走他们的财产,看到他们的亲人哭泣,骑着他们的马,把他们的女儿和妻子紧紧地抱在怀里。成吉思汗。谁知道这话是不是真的是……大明白银帝国是如何扇动全球经济的我们上回说到,大明开国先是铸造了铜币,但是铜矿的开采和铸造跟不上,所以从货币过渡到纸钞,但是他们又不懂货币规律,货币管理体系还不如前朝,经常超发。于是不到五代,钞票已经基本变成……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网