2

JEP 406规定:

由 switch 标签引入的模式变量在关联的
switch 规则表达式、switch 规则块或 switch 规则抛出语句中肯定匹配。

这是否意味着模式匹配开关需要强制详尽,无论它是用作语句还是表达式?

4

1 回答 1

2

你问了两个不同的问题。你的问题的标题问

模式匹配开关是否需要在 java 中总是详尽无遗?

答案是肯定的。这在§14.11.2中给出:

如果该switch语句是增强switch语句,则它必须是详尽无遗的。

“增强型 switch 语句”的定义在该语句之前不久给出

增强 语句是这样一种switch语句,其中 (i) 选择器表达式的类型不是char, byte, short, int, Character, Byte, Short, Integer, String, 或枚举类型,或 (ii) 至少一个开关标签具有模式 case 标签元素或一个null案例标签元素。

这意味着带有模式匹配的 switch 始终是增强的 switch 语句。


但是你的问题的主体是一个不同的、非常具体的问题:

由 switch 标签引入的模式变量在关联的
switch 规则表达式、switch 规则块或 switch 规则抛出语句中肯定匹配。

这是否意味着模式匹配开关需要强制详尽,无论它是用作语句还是表达式?

这个问题的答案是,不,这个引用的句子没有那个意思。这句话的主语是“模式变量”,其作用域是“关联的 switch 规则表达式、switch 规则块或 switch 规则抛出语句”。因此,它甚至没有远程谈论整个switch声明的详尽性。

当你有时,例如

   case Point p && p.x > 20 -> System.out.println("the right " + p);

“模式变量”是p,右边的部分->是“关联的切换规则表达式”,引用的句子说在后者中,变量p是“绝对匹配的”:

这对于§6.3确定变量将在范围内并初始化到右侧->(或者:如果您仍在使用它)是正式必要的。

模式变量声明的范围(即由模式声明的局部变量)是在值与模式匹配成功后可能执行的程序部分(第14.30.2 节)。它是通过考虑模式变量在以声明模式变量的模式开始的区域中明确匹配的程序点来确定的。

于 2021-10-04T16:11:22.760 回答