为什么下面的代码段总是返回一个双精度值

问题描述:

为什么下面的代码段总是返回一个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

您的三元基础和条件,基于代码的等价的说法是错误的。

此代码:

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 

使用“?:”运算符,“:”的每一端必须返回相同的值类型。因此,编译器施放,因为它可以...

试试这个:

Object foo = integer ? (Object)new Integer((int) bar) : (Object)new Double(bar);