2017-01-23 339 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只是爲了使用這個詞有害。 –