为什么以下代码段始终返回Double

时间:2016-01-13 15:31:30

标签: java

为什么即使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;
}

没有任何问题。

2 个答案:

答案 0 :(得分:3)

您对基于三元和基于条件的代码的等效性的断言是错误的。

此代码:

integer ? (int) bar : bar;

必须返回一种类型,即double,因为bar是双倍的,(int) bar可以提升为双倍。

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

RHS自动装箱到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到double的升级:在肯定的情况下分配给foo的表达式是int类型(自动装箱到整数),而在负面情况下是键入double(自动装箱为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

答案 1 :(得分:0)

使用“?:”运算符,“:”的每一行必须返回相同的值类型。所以编译器可以投射......

试试这个:

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