包装和自动拳击

Dav*_*ide 10 java autoboxing wrapper

有以下代码:

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);
Run Code Online (Sandbox Code Playgroud)

它打印:

12.0

这个不编译.为什么?

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

Bat*_*eba 12

差异是由于Java中的三元运算符行为.


三元条件案例:

在表达式中late ? lateTime : time,Java将自动将其中一个参数(根据值late)自动取消打包到其各自的基本类型.(你可以通过设置观察此timenulllatetrue:一个NullPointerException没有抛出设置的情况也一样.lastTimenulllatefalse.)

如果表达式的值将是time,那么这被加宽double.

在任何一种情况下,结果double都会自动加载到Double分配给它result.


简单的作业案例:

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


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