基于第一个值的Java三元运算符数据类型转换?
我遇到了一件我以前没有注意到的事情 这是一个正常的表达式基于第一个值的Java三元运算符数据类型转换?,java,operators,Java,Operators,我遇到了一件我以前没有注意到的事情 这是一个正常的表达式 int a = 5; System.out.println(((a < 5) ? 0 : 9)); inta=5; 系统输出println(((a
int a = 5;
System.out.println(((a < 5) ? 0 : 9));
inta=5;
系统输出println(((a<5)?0:9));
所以这只是将9打印为int。现在如果我将第一个值字符串而不是int 0
int a = 5;
System.out.println(((a < 5) ? "asd" : 9));
inta=5;
系统输出println(((a<5)?“asd”:9));
这里,值9被打印为字符串,而不是int。要确认这一点,请尝试将其与另一个整数相加
int a = 5;
System.out.println((((a < 5) ? 0 : 9) + 4) );
inta=5;
系统输出println(((a<5)?0:9)+4);
现在结果是13,但如果将第一个值改为string而不是int 0,则会出现编译错误
"The operator + is undefined for the argument type(s) Object&Serializable&Comparable<?>, int".
“参数类型对象&Serializable&compariable,int的运算符+未定义”。
我对这个编译错误感到困惑。这背后究竟是什么?感谢解释表达式的类型
(a<5)?“asd”:9取决于第二个和第三个操作数的类型-“asd”和9。这两个操作数的唯一常见类型是对象
(如果int
被装箱为整数
)
因此表达式的类型是Object
,Java没有接受Object
和int
作为操作数的+
运算符。因此出现了编译错误
在
System.out.println(((a<5)?0:9)+4);
三元条件表达式的类型为int
,而int
和int
是+
运算符的可接受操作数。
(a < 5) ? "asd" : 9
(a<5)?“自闭症”:9
是
对象、可序列化和可比较
您可以在问题后面的编译器错误中看到这一点。将int
9
装箱为Integer
,然后找到该字符串与字符串之间的通用类型。因此,实际上您正在调用println(Object)
重载,而不是println(String)
或println(int)
println(Object)
对其参数调用toString
如果您试图将+
应用于对象&可序列化和可比较的,则字符串串联或算术都不适用,因此编译器错误。这一点已详细说明,绝对不值得在此重复。TL;DR:条件运算符的结果是第二个和第三个操作数的最小上界。我不知道这一点,因此感到困惑,无论如何,感谢您的澄清。如果您认为这一点令人困惑,请尝试找出Object result=true的类型?整数.valueOf(0):双精度.valueOf(0)代码>。
(a < 5) ? "asd" : 9
Object&Serializable&Comparable<?>