Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8:结合instanceof和三元运算符的奇怪结果_Java_Ternary Operator_Instanceof - Fatal编程技术网

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)
的实例,并使用
=
进行比较。它们都是一样的。@HotLicks
Double
,而不是
Integer
@Pokechu22:谢谢你的关注。不幸的是,这不是实际代码中的错误。什么是
stepSize
?你怎么知道分配了什么?你的
ZERO\u I
Double
。它不应该是一个
整数
?创建十个
Double.valueOf(0)
的实例,并使用
=
进行比较。它们都是一样的。@HotLicks
Double
,而不是
Integer
@Pokechu22:谢谢你的关注。不幸的是,这不是实际代码中的错误。因此它会自动转换/装箱int,而
int
?@thatotherguy:这就解决了它。非常感谢。所以它会自动转换/装箱int,而
int
?@其他人:这就解决了它。非常感谢。