摘自一本Java书:
在条件表达式中混合Integer
和Double
类型时,Integer
值被取消装箱,提升为double
,然后装箱成Double
:
Integer a = 1;
Double b = 2.0;
System.out.println(true? a : b); // 1.0
对我来说,那是意外的结果。 Integer
如何在此条件表达式中转换为Double
?
答案 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实际上是打印一个双。
希望能回答您的问题。