为什么有人会这样做?
int foo;
foo = (true?this.getFoo() : 0); //getFoo() returns int
它突然出现了一堆,我真的不明白这不会总是等同于:
int foo = this.getFoo();
这仅用于int类型的变量,并使用返回int的getter。弦乐不会得到同样的待遇。
编辑以包含答案:(来自Andy Turner的评论)
就问题而言,#34;是真的吗? getFoo():0在逻辑上等价 to getFoo()":这在语言规范中得到了回答,它说: "如果第一个操作数的值为true,则为第二个操作数 表达被选中。" (和"未选择的操作数表达式不是 评估有条件的特定评估 表达",虽然在这种情况下如果0是无关紧要的 评估然后丢弃,因为没有副作用 评估它)
答案 0 :(得分:8)
在这种情况下,使用三元数绝对没有任何理由。
答案 1 :(得分:6)
如果this.getFoo()
是Integer
,Short
或Byte
,则可能会触发使用条件运算符解除拆箱的一些不正常行为。
例如,如果this.getFoo()
返回null
,则此表达式会生成NullPointerException
。
除了玩具示例之外,没有充分的理由来写这个。
如果this.getFoo()
返回原始类型,则绝对没有理由写它。 foo = true ? this.getFoo() : 0;
相当于foo = this.getFoo()
。
语言规范的相关部分为Sec 15.25,其中包含:
如果第一个操作数的值为true,则选择第二个操作数表达式。
(它还说:
未针对条件表达式的特定评估
评估未选择的操作数表达式
虽然在这种情况下,如果对0进行评估然后丢弃并不重要,因为没有评估它的副作用。)
条件运算符在装箱和拆箱方面有一些非常奇特的行为。例如:
condition ? 0 : null
选中0
,所以总是成功;但
condition ? 0 : (Integer) null
取消装箱 null
,当NullPointerException
为假时,condition
会失败。
而且,显而易见的是
的结果true ? Integer.valueOf(0) : Double.valueOf(0)
是Double
。
嵌套条件表达式更加阴险,例如
Integer i = condition1 ? 1 : condition2 ? 2 : null;
因为整体表达式的类型为int
,而不是Integer
,因此您可以获得NullPointerException
,即使看起来您正在获得Integer
,因为您要分配给Integer
类型的变量。实际上,它的评估如下:
Integer i = Integer.valueOf(condition1 ? 1 : (condition2 ? Integer.valueOf(2) : null).intValue()));
条件运算符有一些非常毛茸茸的规则,只有在涉及盒装数字类型时才应该非常谨慎地使用。
答案 2 :(得分:3)
三元毫无意义:条件总是正确的。
就像你写了一样:
/api
这是一个三元有意义的例子
假设foo = this.getFoo();
返回可能为this.fetFoo()
的{{1}},您可以编写此代码以阻止Integer
:
null
或没有重复调用NullPointerException
但更详细:
int foo = this.getFoo() == null ? 0 : this.getFoo();