java - 使用三元运算符与字节变量类型不匹配

标签 java conditional-operator

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/

相关文章:

c# - 优化 C# 中的条件运算符分支

java - Arrays.parallelSetAll() 的时间复杂度是多少?

c - 为什么条件运算符是右结合的?

c# - 如何对 Nullable Int 使用条件运算

java - 使用 Java 桌面应用程序的 Telegram API?

javascript - 为什么 JS 中带有多个语句的三元运算符不起作用?

java - 如何强制 Java 接受方法调用的参数之一的条件类型?

java - Java 网页脚本

java - JDBC/Access : user lacks privilege or object not found

用于将不明确的结果集作为 ArrayList 返回的 Java、MySQL 方法