【问题标题】:Strange things in java [duplicate]java中的奇怪事物[重复]
【发布时间】:2017-02-19 08:18:28
【问题描述】:

在java中发现了一些奇怪的东西。

代码:

System.out.println(System.getProperty("java.version"));
System.out.println((true) ? (int)2.5 : 3.5);
System.out.println((true) ? (int)2.5 : 3);
System.out.println((true) ? (int)2.5 + "" : 3.5);

结果:

1.8.0_40 2.0 2 2

这是什么?为什么只有当 false 的值不是 double 或将字符串值添加到 true 的值时才返回整数值?为什么在第二行舍入由 (int) cast 起作用,但双值返回呢?是bug吗?

【问题讨论】:

  • 不,这些东西不是错误。
  • 就编译器而言,整个?: 表达式只有一种类型,它通过找到双方最窄的共同类型来计算。
  • (我承认我很惊讶最后一行可以编译。)
  • @LouisWasserman 我认为它必须通过自动装箱。
  • 参考规范,在链接的问题中注意this answer 相同的行为。

标签: java types casting double


【解决方案1】:

在示意图中:

(true) ? (int)2.5 : 3.5

         int        double
           \        /
             double

double 文字 2.5 被下采样到 int 2,然后提升回 double 2.0,因为这是条件表达式的类型。

【讨论】:

    【解决方案2】:

    https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25 指定了所有这些规则,它们的行为与您观察到的输出完全一致。

    整个三元表达式只有一种类型,这就是返回的内容,这就是 System.out.println 被调用的内容。如果您在该规范中的表格中查找它,您会发现您提到的行中的类型将分别为 doubleintObject

    【讨论】:

      【解决方案3】:

      三元运算符有一个常量返回类型。

      来自JLS, section 15.25

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

      这意味着在(true) ? (int)2.5 : 3.5 中,2.5 被转换为int,(向下舍入)然后扩大为double

      (true) ? (int)2.5 : 3中,int不需要扩大为double,因为另一边也是int

      最后,在(true) ? (int)2.5 + "" : 3.5); 中,它不能加宽,因为它已经被转换为String

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多