Java 为什么下面的代码段总是返回一个Double

Java 为什么下面的代码段总是返回一个Double,java,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; } 无任何问题。使用“:”运算符时,:”的每一侧必须返回相同的值类型。所以编译器尽可能地强制转换 试

为什么下面的代码段总是返回一个
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;
}
无任何问题。

使用“:”运算符时,:”的每一侧必须返回相同的值类型。所以编译器尽可能地强制转换

试试这个:

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

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

此代码:

integer ? (int) bar : bar;
必须返回单个类型,即
double
,因为
bar
是double,并且
(int)bar
可以升级为double

就其本身而言

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
(自动装箱到双精度)类型:


因为
integer
false
我建议包含所有相关代码(包括“integer”的初始化)。Foo是一个对象,通过(integer)而不是(int)强制转换是否明智?另外,不要使用保留关键字的备用大小写版本作为变量名。
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