我正在玩弄java,我发现了一些东西。它最好显示在这里:
boolean boo = true;
Object object1 = boo ? new Integer(1) : new Double(2.0);
Object object2;
if (boo)
object2 = new Integer(1);
else
object2 = new Double(2.0);
System.out.println(object1);
System.out.println(object2);
我希望这两者是相同的,但这是印刷品:
1.0
1
有没有人对此有好的解释?
答案 0 :(得分:3)
三元组必须为这两种条件返回相同的类型,因此您的第一个结果(Integer
)提升为双倍以匹配2.0
。另见,
Object object1 = boo ? new Integer(1) : new Double(2.0);
System.out.println(object1.getClass().getName());
这在JLS-15.25.2 - Numeric Conditional Expressions记录,其中(部分)
否则,二进制数字提升(§5.6.2)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。
答案 1 :(得分:1)
JLS section 15.25有一个table,根据其操作数的类型汇总条件表达式的类型。对于Integer
和Double
的情况,表格表明该类型是将二进制数字提升应用于参数(§15.25.2)
否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。
请注意,二进制数字促销执行值集转换(第5.1.13节)并可执行拆箱转换(第5.1.8节)。
如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。
...
如果任一操作数的类型为double,则另一个操作数将转换为double。
这就是
发生的事情Object object1 = boo ? new Integer(1) : new Double(2.0);
new Integer(1)
已取消装箱到原始int
1。new Double(2.0)
已取消装入原始double
2.0。double
。在这种情况下,由于boo
为true
,原始int
1将被提升为double
为1.0。Object
中,原始结果将被装入其包装类型中。对于
的情况Object object2;
if (boo)
object2 = new Integer(1);
else
object2 = new Double(2.0);
if / else构造不执行数字提升。实际上不会有任何拳击转换。由于boo
为true
,因此if
部分将被执行,而object2
将具有值new Integer(1)
。