Java如何确定三元条件运算符表达式的类型?

3

有人能解释一下这是什么吗?

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
A
A
A

从我的角度来看,这看起来很奇怪。我本来期望只有 A 打印出来。而且:当我用 0 替换 i 时,为什么输出会改变呢?输出似乎对于所有的 i 值都是相同的,而不仅仅是 0


你期望看到什么样的行为? - Jeffrey
2个回答

5
当你想要选择苹果或橙子时,你必须推广其中一个(较次的那个)。
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

4

根据Java语言规范,关于类型转换和提升(请参见粗体文本):

Java编程语言中的每个表达式都有一个类型,可以从表达式的结构和在表达式中提到的字面量、变量和方法的类型中推断出。但是,在某些情况下,在不适当的上下文中编写表达式可能会导致错误。在其他情况下,上下文可以接受与表达式类型相关的类型;为了方便起见,而不是要求程序员显式指示类型转换,Java编程语言会从表达式的类型隐式转换为其周围上下文可接受的类型。

在您的情况下,发生在编译时的类型转换解释了输出结果。

在涉及i的情况下,c已被提升为整数。

在涉及0的情况下,它被视为字符,因此c保持为字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接