gpt4 book ai didi

java - 我新建了一个 Integer 实例,但它给了我一个 Long 实例

转载 作者:行者123 更新时间:2023-12-01 23:01:10 25 4
gpt4 key购买 nike

最近遇到一个Java的陷阱,代码在这里:

    Number value = new Integer(10);
value = value instanceof Long ? new Long(-value.longValue()) : new Integer(-value.intValue());

System.out.println(value instanceof Integer);
System.out.println(value.getClass());

我认为输出是:

真实
java.lang.Integer 类

但是,我错了,正确的输出恰恰相反:


java.lang.Long 类

我不明白为什么。所以我使用javap -c反汇编类文件,以下两行(指令)对我来说很奇怪:

50: i2l           
51: invokestatic #10 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
为什么?我想要与对象 value 相同的实例,为什么它给了我不同的结果?

非常感谢您的帮助。

最佳答案

三元运算符接受两个操作数,即new Long(-value.longValue())new Integer(-value.intValue() )

根据Java语言规范http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.6.2 ,两个操作数将首先被拆箱(Long->long)和(Integer->int),参见 http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.8 ,然后应用以下规则:

如果其中一个操作数为 double 类型,则另一个操作数将转换为 double。否则,如果任一操作数的类型为 float,则另一个将转换为 float。否则,如果任一操作数的类型为 long,则另一个将转换为 long。否则,两个操作数都转换为 int 类型。

由于拆箱步骤之后,其中一个操作数的类型为 long,因此另一个操作数将转换为 long。这应该可以解释你的结果。

关于java - 我新建了一个 Integer 实例,但它给了我一个 Long 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23393564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com