繁体   English   中英

为什么 Switch 需要语句但接受表达式

[英]Why Switch requires statement but accepts expressions

我正在研究 switch 表达式,我想我发现了一个奇怪的行为:

public static boolean isTimeToParty(Day day) {
    switch (day) {
        case MONDAY -> dog(); //expression allowed
        case TUESDAY -> 2 + 2; //error: not a statement
        case WEDNESDAY -> true; //error: not a statement
        default -> System.out.println("");
    }
    return false;
}

public static int dog() {
    return 2;
}

为什么我可以输入值dog()这是一个表达式但不允许其他类型的表达式? Intellij 提示我"not a statement"错误。

提前致谢。

IntelliJ 识别出您正在尝试使用 switch 语句而不是 switch 表达式。 如果您将代码更改为:

    int val = switch (day) {
        case MONDAY -> dog();
        case TUESDAY -> 2 + 2;
        case WEDNESDAY -> true;
        default -> System.out.println("");
    }

您会发现错误现在出现在 print 语句和true值上,因为它们无法转换为int 这是因为 Intellij 现在将您的代码识别为 switch 表达式。

换句话说,switch 表达式的所有分支必须是相同类型的表达式,而 switch 语句的分支必须是语句。 方法 call dog()是两者,因此它可以在任一上下文中工作。

根据语言规范,方法调用表达式也可以用作语句:

14.8. 表达式语句

某些类型的表达式可以通过在它们后面加上分号来用作语句。
表达式语句:
语句表达式;
语句表达式:
任务
预增量表达式
PreDecrement 表达式
后增量表达式
后递减表达式
方法调用
类实例创建表达式

倒数第二行表示可以将方法调用表达式用作语句,这就是接受dog()原因。 返回值被简单地丢弃。 2 + 2不能用作语句。

问题是2 + 2true不是 Java 语句。 参考文档中,我们可以阅读以下内容:

语句大致相当于自然语言中的句子。 一条语句构成了一个完整的执行单元。 通过以分号 (;) 终止表达式,可以将以下类型的表达式组成语句。

  • 赋值表达式
  • 任何使用 ++ 或 --
  • 方法调用
  • 对象创建表达式

这样的语句称为表达式语句。 以下是表达式语句的一些示例:

//赋值语句
aValue = 8933.234;

// 增量语句
一个值++;

// 方法调用语句
System.out.println("世界你好!");

// 对象创建语句
自行车 myBike = new Bicycle();

2 + 2true都不是,因为它们是表达式,因此 switch 语句中的编译错误。

开关位于语句上下文中。 语句也可能是方法调用,丢弃其结果。 还存在 switch 表达式,其中的要求是相反的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM