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)
被取消装箱到原语int
1。
- 引用类型
new Double(2.0)
未装箱到原始double
2.0。
- 执行二进制数字提升,结果为 类型
double
。在这种情况下,因为boo
is 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)
。