2016-10-10 66 views
5

在java中發現了一些奇怪的東西。java中的奇怪事物

代碼:

System.out.println(System.getProperty("java.version")); 
System.out.println((true) ? (int)2.5 : 3.5); 
System.out.println((true) ? (int)2.5 : 3); 
System.out.println((true) ? (int)2.5 + "" : 3.5); 

結果:

 
1.8.0_40 
2.0 
2 
2 

這是什麼?爲什麼整數值只有在false的值不是double或字符串值爲true時才返回?爲什麼在第二行舍入由(int)強制轉換工作,但雙值返回呢?這是一個錯誤嗎?

+0

不,這些東西不是bug。 – Jesper

+4

就編譯器而言,整個'':'表達式只有一種類型,它通過找出兩邊共同的最窄類型來表示這一點。 –

+0

(我坦白,我很驚訝,最後一行編譯,雖然。) –

回答

3

在示意性:

(true) ? (int)2.5 : 3.5 

     int  double 
      \  /
      double 

double的字面2.5被下采樣到int 2,然後提升回double 2.0,因爲這是條件表達式的類型。

4

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25指定所有這些規則,這些規則的行爲與觀察到的輸出完全一致。

整個三元表達式只有一種類型,這就是返回的內容,這就是System.out.println被調用的內容。如果您在該規範的表格中查找它,您會發現您提到的行中的類型將分別爲doubleintObject

2

三元運算符具有常數返回類型。

JLS, section 15.25

否則,二進制數值提升(§5.6.2)被施加到操作數類型,以及條件表達式的類型是所述第二和第三操作數的提升的類型。

這意味着,在(true) ? (int)2.5 : 3.52.5轉換爲int,(向下),然後加寬到double

(true) ? (int)2.5 : 3中,int不需要被擴大至double,因爲對方也是int

最後,在(true) ? (int)2.5 + "" : 3.5);,它不能被加寬,因爲它已經被轉換爲String