2013-10-11 33 views
1
public static void main(String[] args) { 
    Object o=true?new Integer(1):new Double(1.0); 
    System.out.println(o); 
} 

意外輸出我得到1.0作爲輸出,首先在上述else語句是不可到達的,但它的汽車類型如何鑄造。混亂而正從java程序

+9

您從這裏嗎???[奇怪-Java的行爲複製 - 它是一個錯誤](http://stackoverflow.com/questions/19293575/strange-java-behaviour-is-it-a-bug),如果沒有抱歉。看這裏。 –

+0

是的,抱歉@SURESH ATTA,那個答案是無法理解的。 – user2826111

+0

你在這個答案中有什麼不明白的地方? –

回答

3

JLS規定

加寬原語轉換(§5.1.2)被施加到轉換的任一個或由下面的規則中指定的兩個 操作數: •如果一個操作數的類型的雙,所述其他轉換爲雙倍。

是在表達

true? Integer(1) : Double(1.0) 

因爲這裏的操作之一是雙倍返還型也增加一倍

+1

爲了使這裏的事情複雜化,後者被認爲是死代碼。因此,即使第三個操作數表達式永遠不能執行,轉換爲Double仍然會發生。如果他說過 '是真的?整數(1):Double(2.0)' 輸出仍然是1.0,Object將被視爲Double。 – TechTrip

1

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6

的關鍵字是「數值提升」:

數字優惠用於數字 操作者的操作數轉換成一個共同的類型,以便可以執行的操作。 兩種數字提升是一元數字提升(§5.6.1) 和二進制數字提升(§5.6.2)。

sᴜʀᴇsʜᴀᴛᴛᴀ已經給了你一個鏈接解釋你的具體的例子。