Java 8:结合了instanceof和三元运算符的奇怪结果

sad*_*tsu 0 java instanceof ternary-operator

我正在编写一个方法,其中所有参数都是doubles或ints.由于两个重载的内部代码都相同,我认为编写接口接受Numbers 会更容易.

我需要在此方法中做的一件事是验证其中一个参数大于零.为了实现这一点,我可以compare()将传递的值反对为零,我有以下静态字段:

private static final Double ZERO_D = Double.valueOf(0);
private static final Integer ZERO_I = Integer.valueOf(0);
Run Code Online (Sandbox Code Playgroud)

在相关方法中,我然后尝试执行此测试:

Number zero = ((stepSize instanceof Double) ? ZERO_D : ZERO_I);
Run Code Online (Sandbox Code Playgroud)

奇怪的是这个代码总是设置zeroZERO_D.

我目前正在使用以下代码成功解决此问题:

Number zero;
if (stepSize instanceof Double) {
  zero = ZERO_D;
} else {
  zero = ZERO_I;
}
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么我得到这个奇怪的结果?如果可以的话,我更愿意在这里使用三元运算符.

tha*_*guy 5

发生这种情况是因为三元运算符总是求值为单一类型,在您的情况下,给定第二个和第三个参数的Java数字,最终类型应为Double,因此它将Integer转换为匹配.

您可以进行强制转换以使其返回Number:

Number zero = ((stepSize instanceof Double) ? (Number) ZERO_D : ZERO_I);
Run Code Online (Sandbox Code Playgroud)