为什么即使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 :(得分: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);