Java8:结合instanceof和三元运算符的奇怪结果
我正在编写一个方法,其中它的所有参数要么是Java8:结合instanceof和三元运算符的奇怪结果,java,ternary-operator,instanceof,Java,Ternary Operator,Instanceof,我正在编写一个方法,其中它的所有参数要么是doubles,要么是ints。由于两个重载的大部分代码内部都是相同的,所以我认为编写接受Numbers的接口会更容易 在这个方法中,我需要做的一件事是验证其中一个参数是否大于零。为了使它能够compare()将传递的值与零进行比较,我有以下静态字段: private static final Double ZERO_D = Double.valueOf(0); private static final Integer ZERO_I = Integer.
double
s,要么是int
s。由于两个重载的大部分代码内部都是相同的,所以我认为编写接受Number
s的接口会更容易
在这个方法中,我需要做的一件事是验证其中一个参数是否大于零。为了使它能够compare()
将传递的值与零进行比较,我有以下静态字段:
private static final Double ZERO_D = Double.valueOf(0);
private static final Integer ZERO_I = Integer.valueOf(0);
在所讨论的方法中,我尝试执行以下测试:
Number zero = ((stepSize instanceof Double) ? ZERO_D : ZERO_I);
奇怪的是,该代码总是将zero
设置为zero\u D
我目前正在使用以下代码成功解决此问题:
Number zero;
if (stepSize instanceof Double) {
zero = ZERO_D;
} else {
zero = ZERO_I;
}
谁能解释一下为什么我会得到这个奇怪的结果?如果可以的话,我更愿意在这里使用三元运算符。之所以会出现这种情况,是因为三元运算符的计算结果总是为单一类型,在您的例子中,Java数字给出了第二个和第三个参数,因此它会将整数转换为匹配 您可以强制转换,使其返回一个
数字
:
Number zero = ((stepSize instanceof Double) ? (Number) ZERO_D : ZERO_I);
之所以会出现这种情况,是因为三元运算符总是计算为单一类型,在您的例子中,Java表示给定第二个和第三个参数的值,因此它将整数转换为匹配的值 您可以强制转换,使其返回一个
数字
:
Number zero = ((stepSize instanceof Double) ? (Number) ZERO_D : ZERO_I);
三元运算符的两个分支必须具有相同的类型。根据《公约》第15.25节: 如果第二个和第三个操作数表达式都是数值表达式,则条件表达式是数值条件表达式 并说: 数值条件表达式的类型确定如下:[不适用于代码的几种情况]二进制数值提升(§5.6.2)应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型 在这方面,扩大的规则是: 如果其中一个操作数的类型为double,则另一个操作数将转换为double
因此,您的
整数
被取消装箱,转换为双精度
,并装箱为双精度
,数值条件表达式的类型为双精度
。(事实上,我不是100%确定。可能是类型是double
,当double
分配给您的编号时会发生装箱)三元运算符的两个分支必须具有相同的类型。根据《公约》第15.25节:
如果第二个和第三个操作数表达式都是数值表达式,则条件表达式是数值条件表达式
并说:
数值条件表达式的类型确定如下:[不适用于代码的几种情况]二进制数值提升(§5.6.2)应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型
在这方面,扩大的规则是:
如果其中一个操作数的类型为double,则另一个操作数将转换为double
因此,您的整数
被取消装箱,转换为双精度
,并装箱为双精度
,数值条件表达式的类型为双精度
。(事实上,我不是100%确定。可能是类型是double
,当double
被分配给您的编号时会发生装箱)什么是步长
?你怎么知道分配了什么?你的ZERO\u I
是Double
。它不应该是一个整数
?创建十个Double.valueOf(0)
的实例,并使用=
进行比较。它们都是一样的。@HotLicksDouble
,而不是Integer
@Pokechu22:谢谢你的关注。不幸的是,这不是实际代码中的错误。什么是stepSize
?你怎么知道分配了什么?你的ZERO\u I
是Double
。它不应该是一个整数
?创建十个Double.valueOf(0)
的实例,并使用=
进行比较。它们都是一样的。@HotLicksDouble
,而不是Integer
@Pokechu22:谢谢你的关注。不幸的是,这不是实际代码中的错误。因此它会自动转换/装箱int,而int
?@thatotherguy:这就解决了它。非常感谢。所以它会自动转换/装箱int,而int
?@其他人:这就解决了它。非常感谢。