为什么以下代码的输出是 9.0 而不是 9 ?如果三元运算符只不过是 if-else 分支的简短形式,那么为什么 java 编译器将 int 提升为 double ?
public class Ternary
{
public static void main(String args[])
{
int a = 5;
System.out.println("Value is - " + ((a < 5) ? 9.9 : 9));
}
}
如果三元运算符只不过是 if-else 分支的简短形式,那么为什么 java 编译器将 int 提升为 double ?
条件表达式具有单一类型,第二个和第三个操作数都将根据需要转换为单一类型。JLS 给出了确定表达式类型的规则,由于自动拆箱,这些规则稍微复杂一些。
条件运算符只是/构造的简写,但不是我认为您期望的那种简写。所以你的代码相当于这个:if
else
double value;
if (a < 5) {
value = 9.9;
} else {
value = 9;
}
System.out.println("Value is - " + value);
它不是以下简称:
if (a < 5) {
System.out.println("Value is - " + 9.9);
} else {
System.out.println("Value is - " + 9);
}
有关更多详细信息,请参阅Java 语言规范的第 15.25 节。
因为在这种情况下conditional operator
(是的,它是条件运算符而不是三元运算符)的类型将是第三个操作数的提升类型,因为第二个和第三个操作数的类型不同。
这在JLS 部分 - 15.25中明确列出: -
否则,如果第二个和第三个操作数具有可转换(第 5.1.8 节)为数字类型的类型,则有以下几种情况:
如果其中一个操作数是 byte 或 Byte 类型,而另一个是 short 或 Short 类型,> 则条件表达式的类型是 short。
如果其中一个操作数是 T 类型,其中 T 是 byte、short 或 char,而另一个操作数是 int 类型的常量表达式(第 15.28 节),其值可在类型 T 中表示,则条件表达式的类型为T。
如果其中一个操作数是 T 类型,其中 T 是 Byte、Short 或 Character,而另一个操作数是 int 类型的常量表达式(第 15.28 节),其值可在 U 类型中表示,这是应用拆箱的结果转换为 T,则条件表达式的类型为 U。
否则,二进制数值提升(第 5.6.2 节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。
请参阅最后一点,这在这里很有用。因此,在这种情况下,作为规则binary numeric promotion
- 请参阅JLS 第 5.6.2 节: -
- 如果任一操作数是 double 类型,则另一个操作数将转换为 double。
因为整个表达式的类型是double
,因为运算符的操作数之一是 a double
。包含三元的表达式的类型由操作数决定,它们必须是相同的类型。在您的表达式的情况下,将9
强制转换为 adouble
以使其与9.9
.
Java 需要在编译时知道结果的类型。因此,由于此三元运算符可以生成 int 或 double,编译器选择 double 作为结果类型。