Java条件赋值中的类型错误

Sam*_*ley 20 java conditional-operator

在下面的代码中,我有两个相同的条件赋值操作,一个返回Double类型的对象,第二个返回字符串"Integer".

double d = 24.0;

Number o = (d % 1 == 0) ? new Double(d).intValue() : new Double(d).doubleValue();
String result = (d % 1 == 0) ? "Integer" : "Double";

System.out.println(o.getClass()); // prints "class java.lang.Double"
System.out.println(result); // Integer
Run Code Online (Sandbox Code Playgroud)

为什么完全相同的表达式返回两个不同的东西?

Mar*_*aux 20

那么,这是因为条件运算符JLS规范:

否则,如果第二个和第三个操作数具有可转换(第5.1.8节)到数字类型的类型,则有几种情况:

  • ...
  • 否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型.

数字促销在§5.6.2中定义.它说:

应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

  • 如果任一操作数的类型为double,则另一个操作数转换为double.
  • ...

  • 这是条件运算符.它恰好是目前唯一的三元运营商,但这不是它的名字.这就是为什么你得到的链接是"条件运算符?:"而不是"三元运算符?:" (3认同)
  • @ SamuelO'Malley - 您可以通过将三元运算的结果转换为"Number"来"修复"它以获得预期的输出,这将消除编译器进行数字提升的需要:`Number o =(d%1 == 0)?(数字)new Double(d).intValue():( Number)new Double(d).doubleValue();` (2认同)
  • @MartijnCourteaux:是的 - 它相当于"一元"和"二元"但三个.这是我的一个小小的烦恼,我渴望Java和C#引入另一个三元运算符只是为了使之前所有关于"三元运算符"的陈述含糊不清:) (2认同)