栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java Generics进行奇怪的转换

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Generics进行奇怪的转换

它不会抛出,

ClassCastException
因为所有通用类型信息都已从编译后的代码中剥离(此过程称为类型擦除)。基本上,任何类型参数都由代替
Object
。这就是第一个版本起作用的原因。这也是代码完全编译的原因。如果您要求编译器通过
-Xlint:unchecked
标记警告未经检查的操作或不安全的操作,则会在的
return
语句中收到有关未经检查的强制转换的警告
abc()

带有以下语句:

String sss = (Test.<Integer>abc(2)).toString();

故事有点不同。当type参数

T
替换为时
Object
,调用代码将转换为字节代码,该字节代码将结果显式转换为
Integer
。就像代码是使用带有签名的方法编写的,
staticObject abc(Object)
并且语句是这样编写的:

String sss = ((Integer) Test.abc(Integer.valueOf(2))).toString();

也就是说,内部

abc()
类型转换不仅会由于类型擦除而消失,而且编译器还会在调用代码中插入新的类型转换。该强制类型转换
ClassCastException
在运行时生成a
,因为从返回的对象
abc()
String
,而不是
Integer

注意声明

String ss = "" + (Test.<Integer>abc(2));

不需要强制转换,因为编译器只是将返回的对象提供给对象

abc()
的字符串连接操作。(有关此操作的详细信息随Java编译器的不同而不同,但这是对
StringBuilder
append方法的调用,或者,从Java
9开始,是对
StringConcatFactory
。创建的方法的调用。)这里的细节无关紧要;关键是编译器足够聪明,可以识别出不需要强制转换。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/441073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号