Java 在条件表达式中混合整数和双精度
摘自Java书籍: 在条件表达式中混合使用Java 在条件表达式中混合整数和双精度,java,integer,double,boxing,unboxing,Java,Integer,Double,Boxing,Unboxing,摘自Java书籍: 在条件表达式中混合使用整数和双精度类型时,整数值将取消装箱,提升为双精度,并装箱为双精度: Integer a = 1; Double b = 2.0; System.out.println(true? a : b); // 1.0 对我来说,这是一个意想不到的结果。在这个条件表达式中,Integer是如何转换成Double的?这是正常的,它与Java编译器有关,如果您有以下代码行: Integer x = true?a:b; 它将有编译错误,
整数
和双精度
类型时,整数
值将取消装箱,提升为双精度
,并装箱为双精度
:
Integer a = 1;
Double b = 2.0;
System.out.println(true? a : b); // 1.0
对我来说,这是一个意想不到的结果。在这个条件表达式中,
Integer
是如何转换成Double
的?这是正常的,它与Java编译器有关,如果您有以下代码行:
Integer x = true?a:b;
它将有编译错误,您必须强制转换为整数才能将x更改为Double,因为编译器直到运行时才检查条件表达式,结果可能是Double,在您的情况下,System.out.println实际上是打印Double
希望您能回答您的问题。当条件运算符的第二个和第三个操作数是不同类型的数时,将按相同类型应用 在这种情况下,
Double
被取消绑定到Double
Integer
被取消绑定到int
,然后扩展到double
换句话说,这种情况正在发生:
System.out.println(true? (double) a.intValue() : b.doubleValue());
这就是条件运算符的定义方式
请注意,这种行为被认为是非常恶劣的 如果要将操作数保留为其“实际”类型,则需要将它们强制转换为
Number
:
System.out.println(true ? (Number) a : (Number) b);
打印
1
你自己回答了吗?它被解除绑定,然后转换为双精度。