条件表达式"?:"编译,尽管分支返回不同的类型

vla*_*ini 3 java ternary-operator

我已经开始学习java了,我对下面的条件表达式很不满:

 ((1<2)?5:(3<4))
Run Code Online (Sandbox Code Playgroud)

在我发现这个例子的书中,它说这是一个语法错误,因为它无法将数值转换为布尔值.相同页面之后,有一个不同练习的测试,包括这一个.在eclipse中编写和编译后,它给出了输出5.为什么?我已经阅读了关于这个运算符的一些内容,它清楚地表明这两个表达式必须是布尔值或算术,所以这是eclipse的一个问题?

Vih*_*har 13

当他们谈到编译器错误的情况时会是这样的

int a= ((1<2)?5:(3<4));
Run Code Online (Sandbox Code Playgroud)

但是当(3 <4)返回布尔值时,它不能分配给整数变量

但是当你只是这样做时System.out.println(((1<2)?5:(3<4)));,不必将值赋给任何变量,并使用该方法打印输出值System.out.println(Object)

如果你稍微改变表达式并执行: - System.out.println(((1>2)?5:(3<4)))那么它将true作为输出打印

  • 实际上,`对象o =(1 <2)?5:(3 <4);`因为自动装箱而可以使用,你可以从两个分支中获取对象.这就是为什么将结果打印到System.out工作(btw也是一个赋值 - 参数). (2认同)

Jon*_*eet 11

条件运算符有三个操作数 - 第一个是条件,第二个和第三个是分开的"分支".评估哪个分支取决于条件是评估为真还是假.

在您的情况下,您有:

  • 条件: 1 < 2
  • 分支1: 5
  • 店2: 3 < 4

现在的问题是这里的两个分支是不同的类型,因此表达式没有有用的原始结果类型.它(令人惊讶的是,IMO)有效,整体表达类型Object- 基本上,两个分支都涉及拳击.所以这:

Object o = 1 < 2 ? 5 : 3 < 4;
Run Code Online (Sandbox Code Playgroud)

相当于:

Object o = 1 < 2 ? (Integer) 5 : (Boolean) (3 < 4);
Run Code Online (Sandbox Code Playgroud)

这是在JLS 15.25中指定的- 你的情况显示在"表15.25-B.条件表达式类型(原始第3操作数,第II部分)"中,它表明当第三个操作数的类型为boolean,第二个类型为int,结果是lub(Integer,Boolean)- 基本上Object.

现在这没关系:

int x = 1 < 2 ? 5 : 4; // Both branches are of type int
Run Code Online (Sandbox Code Playgroud)

这样:

// Very confusing with all these conditions, but valid!
boolean y = 1 < 2 ? 5 < 6 : 3 < 4; // Both branches are of type boolean
Run Code Online (Sandbox Code Playgroud)

...但是您当前的情况有一个类型的分支int,一个类型boolean.