2017-01-23 287 views
10

有下面的代码:包装和自动装箱

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

Double result = time + 1.0;还会编译 –

+0

[Java自动装箱和三元运算符疯狂]的可能的重复(http://stackoverflow.com/questions/25417438/java-autoboxing-and-ternary-operator-madness) – Tom

回答

12

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


三元有条件的情况下:

在表达式late ? lateTime : time,Java将自动拆箱准确的参数(按照late的值)到其相应的原语类型之一。

如果表达式的值将是time:(设置lastTimenulllatefalseNullPointerException抛出同样适用,您可以通过设置timenulllatetrue观察这个。) ,那么这是加宽double

无论哪种情况,产生的double都会自动装箱到Double,并将其分配给result


简单的分配情况:

在写Double result = time;,爪哇不允许这个,因为它希望你能更加明确。


个人而言,我找到Java三元条件操作的机制相对于盒装原始类型是语言的最有害的部分之一。

+0

好吧,但在第一个例子'result '总是一个Double或被转换为Integer? – Davide

+0

@Eran:我已经对精确的机制更加明确了,并增加了NPE刺痛。 – Bathsheba

+1

Double result = time + 1.0;也会编译。事实上,这样会+ 0.0;和+1只是为了使用这个词有害。 –