Java 条件赋值中的错误类型

2022-09-02 04:34:11

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

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


答案 1

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

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

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

数字升级在 §5.6.2 中定义。它说:

加宽基元转换 (§5.1.2) 应用于转换以下规则指定的任一或两个操作数:

  • 如果任一操作数的类型为双精度型,则另一个操作数将转换为双精度型。
  • ...

答案 2

好吧 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


推荐