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没有接受Object
和int
作为操作数的+
运算符。因此编译错误。
在
System.out.println((((a < 5) ? 0 : 9) + 4));
三元条件表达式的类型是int
,int
和int
是+
运算符可接受的操作数。
类型
(a < 5) ? "asd" : 9
是
Object&Serializable&Comparable<?>
您可以在问题后面的编译器错误中看到这一点。 int
9
被装箱到 Integer
然后找到它和 String
之间的公共类型。所以你实际上是在调用 println(Object)
重载而不是 println(String)
或 println(int)
。 println(Object)
对其参数调用 toString
。
如果您尝试将 +
应用于 Object&Serializable&Comparable<?>
,则字符串连接或算术均不适用,因此会出现编译器错误。
我遇到了这个我以前没有注意到的东西。
这是一个普通的表达式
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没有接受Object
和int
作为操作数的+
运算符。因此编译错误。
在
System.out.println((((a < 5) ? 0 : 9) + 4));
三元条件表达式的类型是int
,int
和int
是+
运算符可接受的操作数。
类型
(a < 5) ? "asd" : 9
是
Object&Serializable&Comparable<?>
您可以在问题后面的编译器错误中看到这一点。 int
9
被装箱到 Integer
然后找到它和 String
之间的公共类型。所以你实际上是在调用 println(Object)
重载而不是 println(String)
或 println(int)
。 println(Object)
对其参数调用 toString
。
如果您尝试将 +
应用于 Object&Serializable&Comparable<?>
,则字符串连接或算术均不适用,因此会出现编译器错误。