[英]Numeric Type Promotion with Conditional Expression
我在玩 java,我注意到了一些東西。 它可以在這里得到最好的展示:
boolean boo = true;
Object object1 = boo ? new Integer(1) : new Double(2.0);
Object object2;
if (boo)
object2 = new Integer(1);
else
object2 = new Double(2.0);
System.out.println(object1);
System.out.println(object2);
我希望兩者是一樣的,但這是打印出來的:
1.0
1
有人對此有很好的解釋嗎?
三元必須為兩個條件返回相同的類型,因此您的第一個結果( Integer
)被提升為double 以匹配2.0
。 也可以看看,
Object object1 = boo ? new Integer(1) : new Double(2.0);
System.out.println(object1.getClass().getName());
這記錄在JLS-15.25.2 - 數值條件表達式中(部分)
否則,二進制數字提升( §5.6.2 )應用於操作數類型,條件表達式的類型是第二個和第三個操作數的提升類型。
JLS 第 15.25 節有一個表格,根據其操作數的類型總結了條件表達式的類型。 對於Integer
和Double
的情況,該表表示類型將是對參數應用二進制數字提升的結果( §15.25.2 )
否則,二進制數值提升(第 5.6.2 節)應用於操作數類型,條件表達式的類型是第二個和第三個操作數的提升類型。
請注意,二進制數字提升執行值集轉換(§5.1.13)並且可以執行拆箱轉換(§5.1.8)。
引用二進制數字提升:
如果任何操作數屬於引用類型,則將對其進行拆箱轉換(第 5.1.8 節)。
...
如果其中一個操作數是雙精度類型,則另一個將轉換為雙精度。
這就是發生的事情
Object object1 = boo ? new Integer(1) : new Double(2.0);
new Integer(1)
被拆箱為原始int
1。new Double(2.0)
被拆箱為原始double
2.0。double
類型。 在這種情況下,由於boo
為true
,原始int
1 將提升為double
為 1.0。Object
中,原始結果被裝箱到它的包裝器類型中。對於以下情況
Object object2;
if (boo)
object2 = new Integer(1);
else
object2 = new Double(2.0);
if/else 構造不執行數字提升。 實際上不會有任何拳擊轉換。 因為boo
是true
,所以if
部分將被執行並且object2
將具有值new Integer(1)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.