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