繁体   English   中英

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

[英]How does Java decide the type of a ternary conditional operator expression?

有谁能解释一下?

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

如果要选择苹果与橙子,则必须提升其中一个(较小的一个):

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM