【问题标题】:How does Java decide the type of a ternary conditional operator expression?Java如何决定三元条件运算符表达式的类型?
【发布时间】:2012-09-08 16:42:03
【问题描述】:
谁能解释一下?
public class Test {
public static void main(String[] args) {
char c = 'A';
int i = 0;
boolean b = true;
System.out.println(b ? c : i);
System.out.println(b ? c : (char)i);
System.out.println(b ? c : 0);
System.out.println(b ? c : (char)0);
}
}
输出:
65
一个
一个
一个
从我站的地方看,它确实看起来很奇怪。我本来希望只有As 可以打印出来。此外:当我用0 替换i 时,输出会发生什么变化? i 的所有值的输出似乎都相同,而不仅仅是 0。
【问题讨论】:
标签:
java
ternary-operator
【解决方案1】:
当你想选择苹果和橙子时,你必须提升其中一个(较小的那个):
public class Test {
public static void main(String[] args) {
char c = 'A';
int i = 0;
boolean b = true;
System.out.println(b ? c : i); // Promoted to int ---> 65
System.out.println(b ? c : (char)i); // Not promoted ------> A (char vs char)
System.out.println(b ? c : 0); // Not promoted vs null/0
System.out.println(b ? c : (char)0); // Not promoted vs char
}
}
如果有一个变量类型,比如nibble,那么你在选择时不会得到不同的输出。
System.out.println(b ? c : (nibble)i); // I know there is no nibble. :)
// nibble promotes to char.
// I know... there is no nibble.
//so, output is A
【解决方案2】:
来自 Java 语言规范,关于类型转换和提升(参见粗体文本)
用 Java 编程语言编写的每个表达式都有一个类型
可以从表达式的结构和文字的类型推导出来,
表达式中提到的变量和方法。然而,有可能
在表达式类型不合适的上下文中编写表达式。
在某些情况下,这会导致编译时出错。在其他情况下,上下文可能
能够接受与表达式类型相关的类型; 为方便起见,
而不是要求程序员显式指示类型转换,
Java 编程语言执行从类型的隐式转换
将表达式转换为其周围上下文可接受的类型。
在编译时发生的类型转换解释了输出。
在涉及i 的情况下,c 已提升为整数。
在涉及0 的情况下,它被视为字符,因此c 仍然是字符。