0

我一直在尝试以更复杂的方式实现以下条件:

if (x > 1) 
 doSomething();
else {
 doSomethingElse();
}

想像这样编码:

(x > 1) ? doSomething() : doSomethingElse();

这根本不可能吗?

4

5 回答 5

4

doSomething()如果退货是不可能的 void。参考JLS 15.25

第一个表达式必须是 boolean 或 Boolean 类型,否则会发生编译时错误。

第二个或第三个操作数表达式调用 void 方法是编译时错误。

事实上,根据表达式语句的语法(第 14.8 节),条件表达式不允许出现在可能出现 void 方法调用的任何上下文中。

最终,第二个和第三个操作数应该评估为相同的类型,JLS 中也提到了如何进行评估。

PS:你为什么要doSomething()同时使用trueor false

于 2013-07-04T09:13:09.407 回答
2

你可以这样写:

i = (x > 1) ? doSomething() : doSomethingElse();

但不是直接这样:

(x > 1) ? doSomething() : doSomethingElse();

因为在JLS §14.8中:

14.8. 表达式语句

某些类型的表达式可以通过在它们后面加上分号来用作语句。

表达式语句:
    语句表达式;

语句表达式:
    任务
    前增量表达式
    预减量表达式
    后增量表达式
    PostDecrement 表达式
    方法调用
    类InstanceCreationExpression

里面没有ConditionalExpression

于 2013-07-04T09:16:16.860 回答
1

不完全笼统;三元中的参数(正式的三元需要表达式)必须评估为相同的类型。

如果 doSomething() 是一种void类型,那么肯定不是。

于 2013-07-04T09:12:52.450 回答
0

它取决于返回类型。如果你这样定义,void doSomething()那么它是不可能的。

于 2013-07-04T09:15:57.057 回答
0

三元组用于内联 if 条件。他们需要一个返回值,因为你可以写这样的东西:

System.out.println((x > 1) ? "True" : "False");

无效,这是不可能的

于 2013-07-04T09:17:27.853 回答