【问题标题】:Why does the following snippet always returns a Double [duplicate]为什么以下代码段总是返回 Double [重复]
【发布时间】:2016-04-18 15:49:30
【问题描述】:

为什么即使integer 为真,下面的sn-p 总是返回Double?

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

同样的代码,改写为:

double bar = 100.0;
Object foo;

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

没有任何问题。

【问题讨论】:

  • 因为integer 是false
  • 我建议包括所有相关代码(包括“整数”的初始化)。
  • Foo 是一个对象,通过 (Integer) 而不是 (int) 进行转换不是明智的吗?
  • 另外,不要使用保留关键字的替代大小写版本作为变量名。

标签: java


【解决方案1】:

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

这段代码:

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

【讨论】:

    【解决方案2】:

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

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多