int a = 10, b = 20;
byte x = (a>b) ? 10 : 20;
前面的代码会产生一个编译时错误:类型不匹配无法从 int 转换为 byte。
奇怪的是,当我用 (true) 替换表达式 (a>b) 时,代码成功编译了! 此外,当我用文字替换表达式 (10>20) 时,代码也可以工作!!
不仅如此,当我显式输入cast 10、20甚至整个三元运算符时,代码也可以工作!
byte x = (a>b) ? (byte)10 : 20;
byte x = (a>b) ? 10 : (byte)20;
byte x = (byte)((a>b) ? 10 : 20);
表达式 (a>b) 到底有什么问题?
请注意,使用 if-else 的等效代码可以正常工作。
int a = 10, b = 20;
byte x;
if(a>b) {
x = 10;
} else {
x = 20;
}
最佳答案
因为当直接用(10>20)
这样的数字指定表达式时,表达式会在编译时本身进行求值,并将结果值分配给字节变量。如果您使用任何 IDE,您可以在此表达式中看到死代码
警告
byte x = (20>10) ? 10 : 20 (Dead code); // because compiler know 20 greater than 10 and assigns 10 to x
但是在使用变量a,b
时,编译器在编译时不知道这些值,并且表达式在运行时计算。由于在 java 中默认数值表示为 int
它要求显式类型转换
byte x = (a>b) ? 10 : 20; //Type mismatch: cannot convert from int to byte
我建议阅读此内容 type casting with ternary operator
关于java - 使用三元运算符与字节变量类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59816497/