Java条件赋值中的类型错误

在下面的代码中,我有两个相同的条件赋值操作,一个返回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 

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

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

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

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

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

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

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

好0.0仍然是==到0

 System.out.println(0 == 0.0); // equals true 

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.25