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

时间:2012-09-08 16:42:03

标签: java ternary-operator

任何人都能解释一下吗?

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才能打印出来。而且:当我用0替换i输出变化时怎么样?对于i的所有值,输出似乎相同,而不仅仅是0

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

从Java语言规范,关于类型转换和促销(参见粗体文本)

  

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

在编译时发生的类型转换解释了输出。

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

在涉及0的情况下,它被视为字符,因此c仍然是字符。