有如下代码:
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 会自动将其中一个参数(根据 late
的值)自动拆箱为其各自的原始类型。 (您可以通过将 time
设置为 null
并将 late
设置为 true
来观察这一点:NullPointerException
是 not 抛出。将 lastTime
设置为 null
并将 late
设置为 false< 时同样适用
.)
如果表达式的值为 time
,则将其扩大为double
。
在任何一种情况下,生成的 double
在分配给 result
时被自动装箱为 Double
。
简单赋值案例:
在编写 Double result = time;
时,Java 不允许这样做,因为它希望您更明确。
就我个人而言,我发现 Java 三元条件运算符关于装箱原始类型的机制是该语言中最有害的部分之一。
关于java - 包装器和自动装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41803947/