在条件表达式中混合整数和双精度

时间:2018-09-28 22:23:30

标签: java integer double boxing unboxing

摘自一本Java书:

在条件表达式中混合IntegerDouble类型时,Integer值被取消装箱,提升为double,然后装箱成Double

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

对我来说,那是意外的结果。 Integer如何在此条件表达式中转换为Double

2 个答案:

答案 0 :(得分:2)

当条件运算符的第二和第三操作数是不同类型的数字时,将应用binary numeric promotion,以使它们具有相同的类型。

在这种情况下,Double被取消装箱到double;将Integer拆箱到int,然后扩大到double

换句话说,这正在发生:

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

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


请注意,这种行为被认为是a compiler error in Google's Java code,足以令人震惊。

如果要将操作数保留为“实际”类型,则需要将其强制转换为Number

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

将打印1

答案 1 :(得分:1)

这是正常现象,与Java编译器有关,如果您具有以下代码行:

  Integer x = true?a:b;

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

希望能回答您的问题。