包装器和自动装箱

Wrappers and Auto-boxing

有如下代码:

Integer time = 12;
Double lateTime = 12.30;
Boolean late = false;
Double result = late ? lateTime : time;  //Why here can I assign an Integer to a Double?
System.out.println(result);

它打印:

12.0

这个不编译。为什么?

Integer time = 12;
Double lateTime = 12.30;
Double result = time;      //Integer cannot be converted to Double
System.out.println(result);

差异是由于 Java 中的三元运算符行为造成的。


三元条件情况:

在表达式 late ? lateTime : time 中,Java 将 auto-unbox 正好是参数之一(根据 late 的值)到其各自的原始类型。 (您可以通过将 time 设置为 null 并将 late 设置为 true 来观察这一点:NullPointerException 而不是 .设置lastTimenulllatefalse时同样适用.)

如果表达式的值为 time,则 扩展 double.

在任何一种情况下,结果 double 是 auto-boxed 到 Double 分配给 result


简单赋值案例:

在写作 Double result = time; 时,Java 不允许这样做,因为它希望您更明确。


就我个人而言,我发现 Java 三元条件运算符关于盒装原始类型的机制是语言中最有害的部分之一。