【问题标题】:Java ternary operator datatype conversion based on the first value?基于第一个值的Java三元运算符数据类型转换?
【发布时间】:2019-01-01 14:03:25
【问题描述】:

我遇到了这个我以前没有注意到的东西。

这是一个正常的表达方式

    int a = 5;
                  System.out.println(((a < 5) ? 0 : 9));

所以这只是将 9 打印为 int。现在如果我把第一个值 String 而不是 int 0

    int a = 5;
                  System.out.println(((a < 5) ? "asd" : 9));

这里的值 9 打印为字符串而不是 int。要确认这一点,只需尝试将其与另一个整数相加

 int a = 5;
             System.out.println((((a < 5) ? 0 : 9) + 4)           );

现在结果为 13,但如果将第一个值更改为 string 而不是 int 0,则会出现编译错误

"The operator + is undefined for the argument type(s) Object&Serializable&Comparable<?>, int". 

我对这个编译错误感到困惑。这背后究竟是什么?谢谢解释

【问题讨论】:

  • 这是完整描述的in the language spec,绝对不值得在这里复制。 TL;DR:条件运算符的结果是第二个和第三个操作数的最小上限。
  • 我不知道这个所以很困惑,无论如何感谢您的澄清。
  • 如果您认为这令人困惑,请尝试找出 Object result = true ? Integer.valueOf(0) : Double.valueOf(0); 的类型。

标签: java operators


【解决方案1】:

类型

(a < 5) ? "asd" : 9

Object&Serializable&Comparable<?>

您可以在问题后面的编译器错误中看到这一点。 int 9 被装箱到 Integer ,然后找到它和 String 之间的公共类型。所以你实际上是在调用println(Object) 重载而不是println(String)println(int)println(Object) 在其参数上调用 toString

如果您尝试将+ 应用于Object&amp;Serializable&amp;Comparable&lt;?&gt;,则字符串连接或算术均不适用,因此会出现编译器错误。

【讨论】:

    【解决方案2】:

    表达式 (a &lt; 5) ? "asd" : 9 的类型取决于第二个和第三个操作数的类型 - “asd”和 9。这两个操作数的唯一常见类型是 Object(如果 int 被装箱为 @ 987654324@)。

    因此表达式的类型是Object,Java 没有+ 运算符接受Objectint 作为操作数。因此编译错误。

    System.out.println((((a < 5) ? 0 : 9) + 4));
    

    三元条件表达式的类型为intintint+运算符可接受的操作数。

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2012-12-15
      • 2017-01-20
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多