JLS第 15.25 节有一个表格,根据其操作数的类型总结了条件表达式的类型。对于 and 的情况Integer,Double该表表明该类型将是对参数应用二进制数字提升的结果(第 15.25.2 节)
否则,二进制数值提升(第 5.6.2 节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。
请注意,二进制数字提升执行值集转换(第 5.1.13 节)并可能执行拆箱转换(第 5.1.8 节)。
引用二进制数字提升:
如果任何操作数属于引用类型,则将对其进行拆箱转换(第 5.1.8 节)。
...
如果任一操作数是双精度类型,则另一个将转换为双精度。
这就是正在发生的事情
Object object1 = boo ? new Integer(1) : new Double(2.0);
- 引用类型
new Integer(1)被取消装箱到原语int1。
- 引用类型
new Double(2.0)未装箱到原始double2.0。
- 执行二进制数字提升,结果为 类型
double。在这种情况下,因为boois true,原语int1 将被提升为double1.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)。