我一直试图以更加软化的方式实施以下条件:
if (x > 1)
doSomething();
else {
doSomethingElse();
}
想要编码:
(x > 1) ? doSomething() : doSomethingElse();
这根本不可能吗?
答案 0 :(得分:4)
doSomething()
返回void
时无效。请参阅JLS 15.25
第一个表达式必须是boolean或Boolean类型,否则会发生编译时错误。
第二个或第三个操作数表达式是void方法的调用是编译时错误。
事实上,通过表达式语句的语法(§14.8),条件表达式不允许出现在可能出现void方法调用的任何上下文中。
最终,第二个和第三个操作数应该评估为相同的类型,JLS中也提到了如何完成此评估。
P.S:为什么你想doSomething()
或true
false
为什么?
答案 1 :(得分:2)
你可以这样写:
i = (x > 1) ? doSomething() : doSomethingElse();
但不是直接这样:
(x > 1) ? doSomething() : doSomethingElse();
因为在JLS §14.8:
14.8。表达式声明
某些类型的表达式可以用分号跟随它们作为语句。
ExpressionStatement: StatementExpression ; StatementExpression: Assignment PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression MethodInvocation ClassInstanceCreationExpression
其中没有ConditionalExpression
。
答案 2 :(得分:1)
不完全一般;三元组中的参数(正式三元组需要表达式)必须评估为相同的类型。
如果doSomething()是void
类型,那肯定不是。
答案 3 :(得分:0)
它取决于返回类型。如果你定义像这样void doSomething()
那么它就不可能。
答案 4 :(得分:0)
三元组用于内联条件。他们需要一个返回值,因为你可以写出类似的东西:
System.out.println((x > 1) ? "True" : "False");
with void这是不可能的