我一直在尝试以更复杂的方式实现以下条件:
if (x > 1)
doSomething();
else {
doSomethingElse();
}
想像这样编码:
(x > 1) ? doSomething() : doSomethingElse();
这根本不可能吗?
我一直在尝试以更复杂的方式实现以下条件:
if (x > 1)
doSomething();
else {
doSomethingElse();
}
想像这样编码:
(x > 1) ? doSomething() : doSomethingElse();
这根本不可能吗?
doSomething()
如果退货是不可能的 void
。参考JLS 15.25
第一个表达式必须是 boolean 或 Boolean 类型,否则会发生编译时错误。
第二个或第三个操作数表达式调用 void 方法是编译时错误。
事实上,根据表达式语句的语法(第 14.8 节),条件表达式不允许出现在可能出现 void 方法调用的任何上下文中。
最终,第二个和第三个操作数应该评估为相同的类型,JLS 中也提到了如何进行评估。
PS:你为什么要doSomething()
同时使用true
or false
?
你可以这样写:
i = (x > 1) ? doSomething() : doSomethingElse();
但不是直接这样:
(x > 1) ? doSomething() : doSomethingElse();
因为在JLS §14.8中:
14.8. 表达式语句
某些类型的表达式可以通过在它们后面加上分号来用作语句。
表达式语句: 语句表达式; 语句表达式: 任务 前增量表达式 预减量表达式 后增量表达式 PostDecrement 表达式 方法调用 类InstanceCreationExpression
里面没有ConditionalExpression
。
不完全笼统;三元中的参数(正式的三元需要表达式)必须评估为相同的类型。
如果 doSomething() 是一种void
类型,那么肯定不是。
它取决于返回类型。如果你这样定义,void doSomething()
那么它是不可能的。
三元组用于内联 if 条件。他们需要一个返回值,因为你可以写这样的东西:
System.out.println((x > 1) ? "True" : "False");
无效,这是不可能的