2016-01-13 72 views
1

爲什麼下面的代碼段總是返回一個Double,即使integer爲真?爲什麼下面的代碼段總是返回一個雙精度值

double bar = 100.0; 
Object foo = integer ? (int) bar : bar; 

相同的代碼,重寫爲:

double bar = 100.0; 
Object foo; 

if (integer) { 
    foo = (int) bar; 
} 
else { 
    foo = bar; 
} 

作品沒有任何問題。

+0

因爲'integer'是'FALSE' –

+6

我建議包括所有releva nt代碼(包括「整數」的初始化)。 – obscurite

+0

Foo是一個對象,通過(Integer)而不是(int)投射是否明智? – vdolez

回答

3

您的三元基礎和條件,基於代碼的等價的說法是錯誤的。

此代碼:

integer ? (int) bar : bar; 

必須返回單一類型,那就是double,由於bar是雙,和(int) bar可以被提升到兩倍。

這樣在

Object foo = integer ? (int) bar : bar; 

的RHS被autoboxed到Double

void ternary(double bar, boolean integer) { 
    Object foo = integer ? (int) bar : bar; 
} 

反編譯:

void ternary(double, boolean); 
    Code: 
     0: iload_3 
     1: ifeq   10 
     4: dload_1 
     5: d2i 
     // int promoted to double here. 
     6: i2d 
     7: goto   11 
     10: dload_1 
     // double autoboxed to Double here. 
     11: invokestatic #2     // Method java/lang/Double.valueOf:(D)Ljava/lang/Double; 
     14: astore  4 
     16: return 

在條件形式,沒有從int到雙推廣:在肯定的情況下分配給foo表達式爲int類型(autoboxed爲整數),並在負案是double型(autoboxed爲Double)的:

void conditional(double bar, boolean integer) { 
    Object foo; 

    if (integer) { 
     foo = (int) bar; 
    } 
    else { 
     foo = bar; 
    } 
} 

    void conditional(double, boolean); 
    Code: 
     0: iload_3 
     1: ifeq   14 
     4: dload_1 
     5: d2i 
     6: invokestatic #3     // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
     9: astore  4 
     11: goto   20 
     14: dload_1 
     15: invokestatic #2     // Method java/lang/Double.valueOf:(D)Ljava/lang/Double; 
     18: astore  4 
     20: return 
0

使用「?:」運算符,「:」的每一端必須返回相同的值類型。因此,編譯器施放,因爲它可以...

試試這個:

Object foo = integer ? (Object)new Integer((int) bar) : (Object)new Double(bar); 
相關問題