【问题标题】: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 仍然是字符。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 2014-09-15
      • 2020-03-30
      • 2012-01-22
      • 2012-07-03
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多