包装器和自动装箱
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
是 而不是 .设置lastTime
为null
和late
为false
时同样适用.)
如果表达式的值为 time
,则 扩展 为 double
.
在任何一种情况下,结果 double
是 auto-boxed 到 Double
分配给 result
。
简单赋值案例:
在写作 Double result = time;
时,Java 不允许这样做,因为它希望您更明确。
就我个人而言,我发现 Java 三元条件运算符关于盒装原始类型的机制是语言中最有害的部分之一。
有如下代码:
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
是 而不是 .设置lastTime
为null
和late
为false
时同样适用.)
如果表达式的值为 time
,则 扩展 为 double
.
在任何一种情况下,结果 double
是 auto-boxed 到 Double
分配给 result
。
简单赋值案例:
在写作 Double result = time;
时,Java 不允许这样做,因为它希望您更明确。
就我个人而言,我发现 Java 三元条件运算符关于盒装原始类型的机制是语言中最有害的部分之一。