包装和自动拳击

时间:2017-01-23 10:19:44

标签: java wrapper autoboxing

有以下代码:

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);

1 个答案:

答案 0 :(得分:12)

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

三元条件案例

在表达式late ? lateTime : time中,Java将自动将其中一个参数(根据late的值)自动取消打包到其各自的基本类型。 (您可以通过将time设置为null并将late设置为true来观察此情况:NullPointerException 投掷。同样将lastTime设置为nulllate设置为false时适用。)

如果表达式的值为time,则加宽double

在任何一种情况下,生成的double都会自动加到Double,并将其分配给result

简单的作业案例

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

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