首页 / 知识
关于java:这真的扩展了vs自动装箱吗?
2023-04-11 20:07:00

Is this really widening vs autoboxing?关于Java规范的缺点,我在回答另一个问题时看到了这一点:
我们确定这实际上是加宽而不是自动装箱的示例,还是完全是其他东西? 在我的初始扫描中,我同意以下说法:基于
到
输出将显示" Integer" 这到底是怎么回事?我对Java的编译器/字节码解释器一无所知... 在第一种情况下,转换范围正在扩大。在编译的类上运行" javap"实用程序(包含在JDK中)时,可以看到以下内容:
很明显,您看到了I2L,它是扩展的Integer-To-Long字节码指令的助记符。请参阅此处的参考。 在另一种情况下,用对象" Long x"签名替换" long x",您将在主要方法中使用以下代码:
因此您会看到编译器已创建指令Integer.valueOf(int),以将原始容器装箱在包装器中。 是的,在测试中尝试一下。您将看到" long"字样。之所以会扩展,是因为Java在选择将int自动装箱为Integer之前会选择将int扩展为很长的时间,因此选择了hello(long)方法。 编辑:被引用的原始帖子。 进一步编辑:第二个选项将打印Integer的原因是因为没有将"扩大"到较大的基元作为选项,因此必须将其装箱,因此Integer是唯一的选项。此外,java只会自动装箱到原始类型,因此如果您离开hello(Long)并删除了hello(Integer),它将给编译器错误。 此示例的另一个有趣之处是方法重载。类型扩展和方法重载的结合只能起作用,因为编译器必须决定选择哪种方法。请考虑以下示例:
它不使用List的运行时类型,而是使用Collection的编译时类型,因此打印" Collection"。 我鼓励您阅读《有效的Java》,这使我对JLS的某些极端情况大开眼界。 |
最新内容
相关内容
pythonPython代码的书写规范
pythonPython代码的书写规范,代码,培训,数字,设计,标准,异常,二元,行长,下降,一致,python代码的书写规范1.一致性的建议打破一条既定规则的两关于c#:扩展接口模式
关于c#:扩展接口模式,关于c#:扩展接口模式,扩展,接口,拆分,功能,Extension interface patterns.Net 3.5中的新扩展允许从接口中拆分功能Java自动装箱为什么不扩展到自动装
Java自动装箱为什么不扩展到自动装箱类型的方法的方法调用?,Java自动装箱为什么不扩展到自动装箱类型的方法的方法调用?,原语,字符串,简单介绍HTML的基础规范
简单介绍HTML的基础规范,简单,介绍,HTML,的,基础,规范,HTML,是,一个,弱势,,HTML是一个弱势语言HTML不区分大小写HTML页面的后缀名是JavaScript变量名的代码规范
JavaScript变量名的代码规范,JavaScript,变量,名,的,代码,规范,JavaScript,代码,, JavaScript 代码规范 代码规范通常包