Java 基于第一个值的三元运算符数据类型转换?

Java ternary operator datatype conversion based on the first value?

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

这是一个普通的表达式

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

所以这只是将 9 打印为一个整数。现在如果我把第一个值 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,但如果将第一个值更改为字符串而不是 int 0,则会出现编译错误

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

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

表达式 (a < 5) ? "asd" : 9 的类型取决于第二个和第三个操作数的类型 - "asd" 和 9。这两个操作数的唯一共同类型是 Object(如果int 被装箱到 Integer)。

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

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

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

类型

(a < 5) ? "asd" : 9

Object&Serializable&Comparable<?>

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

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