java - 代码对象 o = true ?新整数(0): new Long(1) returns Long with value 0. 为什么?

标签 java

<分区>

请考虑我们有以下代码:

Object obj = true ? new Integer(0) : new Long(1);
System.out.println(obj.getClass() + "\nvalue = " + obj);

结果是:

class java.lang.Long
value = 0

代替:

class java.lang.Integer
value = 0

有人能解释一下为什么我们在 Java 中有这样的功能吗?这对我来说很奇怪。 您有任何有用的示例吗?

更新: 这是一段字节码,我们可以看到那里发生了什么

NEW java/lang/Integer
DUP
LDC "0"
INVOKESPECIAL java/lang/Integer.<init> (Ljava/lang/String;)V
INVOKEVIRTUAL java/lang/Integer.intValue ()I
I2L
INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long;
ASTORE 1

最佳答案

这里的结果是

  • 将您的 IntegerLong 类型转换为 long 的二进制数字提升,用作应用于条件运算符表达式的通用类型<
  • 拆箱那些包装器对象
  • 然后对条件表达式的结果值进行装箱

条件运算符的第二个和第三个操作数最终必须具有相同的类型,即表达式的结果类型。 IntegerLong 当然不是同一类型。

但是,如 JLS§15.25 中所述,编译器将应用 binary numeric promotion在确定可能的通用类型以应用于表达式时。该部分有方便的表 15.25-D,它告诉我们当第二个操作数是 Integer 类型并且第三个操作数是 Long 类型时,编译器将执行二进制数字Integer,Long 上的提升。 Integer,Long 上的二进制数字提升产生 long。所以条件运算符表达式的结果是long

由于表达式的结果类型是 longIntegerLong 必须被拆箱(然后转换,在整数).

最后,您将它分配给一个 Object,它强制装箱,并将 long 包装在 Long 中。因此,您最终得到一个包含值 0Long,这与您的输出匹配。

如此有效,如果我们忽略编译器将优化以下一半的事实,因为它正在处理常量表达式,这要归功于代码中的 true(我使用了 flag 而不是下面),该代码最终是这样的:

Object obj = Long.valueOf(flag ? (long)(new Integer(0)).intValue() : (new Long(1)).longValue());
System.out.println(obj.getClass() + "\nvalue = " + obj);
  • (long)(new Integer(0)).intValue() 表示拆箱 Integer 并将其转换为 long 所以它匹配表达式结果类型。
  • (new Long(1)).longValue() 表示拆箱 Long,因此匹配表达式结果类型。<
  • Long.valueOf 表示最后的装箱。

关于java - 代码对象 o = true ?新整数(0): new Long(1) returns Long with value 0. 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40845049/

相关文章:

java - 为什么 HTTP POST 返回代码 400(错误请求)? HTTP POST 方法

java - 无法让 JOGL 运行,编译正常但在执行期间出错

java - 使用 java 将 HashMap 的键和值转换为 HTML 表

java - getBytes ("UTF-8")、getBytes ("windows-1252") 和 getBytes() 之间有什么区别?

xml - org.xml.sax.SAXNotRecognizedException : Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized

java - jsprit 作为 php Web 应用程序的后端

java - 如何让Hashmap有序?

java - 我在java应用程序中看不到udp多播流量,而我可以从wireshark中看到

java - @SortableField 在嵌套实体中不起作用

java - 用另一个元素包装 XStream 中的 xml 输出