最近遇到一个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/