簡體   English   中英

使用條件表達式提升數值類型

[英]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 )應用於操作數類型,條件表達式的類型是第二個和第三個操作數的提升類型。

請注意,二進制數字提升執行值集轉換( §5.1.13 )並且可以執行拆箱轉換( §5.1.8 )。

JLS 第 15.25 節有一個表格,根據其操作數的類型總結了條件表達式的類型。 對於IntegerDouble的情況,該表表示類型將是對參數應用二進制數字提升的結果( §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類型。 在這種情況下,由於bootrue ,原始int 1 將提升為double為 1.0。
  • 由於您將結果存儲在Object中,原始結果被裝箱到它的包裝器類型中。

對於以下情況

Object object2;
if (boo)
    object2 = new Integer(1);
else
    object2 = new Double(2.0);

if/else 構造不執行數字提升。 實際上不會有任何拳擊轉換。 因為bootrue ,所以if部分將被執行並且object2將具有值new Integer(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM