21

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

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

4

2 回答 2

20

嗯,这是因为条件运算符的 JLS 规范

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

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

数值提升在§5.6.2中定义。它说:

加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:

  • 如果任一操作数是 double 类型,则另一个操作数将转换为 double。
  • ...
于 2013-11-01T15:21:10.287 回答
-3

那么 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

于 2013-11-01T15:22:56.013 回答