为什么下面的代码段总是返回一个双精度值
问题描述:
为什么下面的代码段总是返回一个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;
}
作品没有任何问题。
答
您的三元基础和条件,基于代码的等价的说法是错误的。
此代码:
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);
因为'integer'是'FALSE' –
我建议包括所有releva nt代码(包括“整数”的初始化)。 – obscurite
Foo是一个对象,通过(Integer)而不是(int)投射是否明智? – vdolez