在条件表达式中混合 Integer 和 Double

mixing Integer and Double in a conditional expression

来自 Java 一本书:

当在条件表达式中混合使用 IntegerDouble 类型时,Integer 值将被取消装箱,提升为 double,然后装箱为 [=12] =]:

    Integer a = 1;
    Double b = 2.0;
    System.out.println(true? a : b); // 1.0

对我来说,这是意想不到的结果。在这个条件表达式中,Integer 是如何转换成 Double 的?

这是正常的,与Java编译器有关,如果你有这行代码:

  Integer x = true?a:b;

它会出现编译错误,您必须转换为 Integer 才能将 x 更改为 Double,因为编译器直到运行时才检查条件表达式,结果可能是 Double,在您的情况下 System.out.println实际上是打印一个double。

希望能回答您的问题。

当条件运算符的第二个和第三个操作数是不同类型的数字时,应用binary numeric promotion,以便它们是同一类型。

在这种情况下,Double被拆箱为doubleInteger 拆箱为 int,然后加宽为 double

换句话说,这件事正在发生:

System.out.println(true? (double) a.intValue() : b.doubleValue());

这就是定义条件运算符的行为方式。


请注意,这种行为被认为是非常过分的 a compiler error in Google's Java code

如果您想将操作数保留为它们的 "actual" 类型,则需要将它们强制转换为 Number:

System.out.println(true ? (Number) a : (Number) b);

将打印 1.