2014-12-04 36 views
12
public static void main(String[] args) { 
    Object o1; 
    if (true) 
     o1 = new Integer(5); 
    else 
     o1 = new Double(2.0); 

    Object o2 = true ? new Integer(5) : new Double(2.0); 

    System.out.println(o1); 
    System.out.println(o2); 
} 

在上面的示例代碼中,通過使用條件運算符(?:)我可以在單行中重寫上面的示例。所以,我認爲o1 & o2的結果必須相同。但是,奇怪的是,結果如下:有條件的運算符,奇怪的行爲

5 
5.0 

難道你們,請幫我指出爲什麼是這種行爲?

修訂: 結果將是用下面的代碼相同的:

Object o2 = true ? (Object) new Integer(5) : new Double(2.0); 
+1

我認爲你'Integer'在這兩種情況下,它很奇怪,但只有在打印時的格式是不同的。 – csmckelvey 2014-12-04 03:20:34

+0

是的,o1,o2都是Integer。 – 2014-12-04 03:24:32

+0

我嘗試了通過做instanceof和第二個結果是錯誤.. o1 instanceof Integer'結果爲true,而'o2 instanceOf Integer'結果s false ..所以這意味着o2不是一個整數 – Secondo 2014-12-04 03:25:22

回答

6

這似乎是自動裝箱的副作用。這個?運算符試圖確定哪個是可以應用於Object的基類型。它看到右側是Double,Integer,也可以自動複製到Double。

也許這樣做是因爲整數可以被裝箱到Double,但是Double不能被裝箱到整數?

注意,這產生相同的結果...

Object o2 = true ? 5 : new Double(2.0); 
+0

我不明白。新的Integer(5)如何被自動複製到'Double'?它已經是一個對象類型。 – Thilo 2014-12-04 03:25:23

+1

將其拆箱並重新裝箱。我並不是說我同意這一點,但是這正是所發生的。的System.out.println(o2.getClass());顯示你是一個Double和boxing是Integer(5)可能被轉換爲Double的唯一方法 – slipperyseal 2014-12-04 03:27:59

+0

@Thilo事實並非如此。二進制數字推廣應用。 – 2014-12-04 03:28:03