在条件表达式中混合 Integer 和 Double
mixing Integer and Double in a conditional expression
来自 Java 一本书:
当在条件表达式中混合使用 Integer
和 Double
类型时,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
被拆箱为double
; Integer
拆箱为 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
.
来自 Java 一本书:
当在条件表达式中混合使用 Integer
和 Double
类型时,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
被拆箱为double
; Integer
拆箱为 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
.