Mar*_*tin 10 java pattern-matching java-21
public class Main {
public static void main(String[] args) {
RecordB recordB = new RecordB(true);
switch(recordB) {
case RecordB b when b.bool() -> System.out.println("It's true");
case RecordB b when !b.bool() -> System.out.println("It's false");
}
}
record RecordB(boolean bool) { }
}
Run Code Online (Sandbox Code Playgroud)
当编译上面的代码时,编译器会产生以下信息:the switch statement does not cover all possible input values
从我的角度来看,这不一定是真的。所以这是我的问题:任何受保护的模式是否总是使编译器的 switch 表达式不详尽,或者我在这里遗漏了一些东西?
lea*_*iro 12
任何受保护的模式是否总是使编译器的 switch 表达式不详尽,或者我在这里遗漏了一些东西?
不,并不是说“任何受保护的模式都会使 switch 语句变得不详尽”,而是必须至少有一个不受保护的模式覆盖该类型。如果不存在任何此类不受保护的模式,那么它就不是详尽的。
更正式地(参见JLS 14.11.1.1. 详尽的开关块),
如果满足以下情况之一,则
switch表达式或语句的 switch 块switch对于选择器表达式来说是详尽的:e
有一个
default与开关块关联的标签。有一个
case null, default与开关块关联的标签。包含与 switch 块关联的无保护标签(统称为元素)中出现的所有
case常量和case模式的集合 是非空的,并且涵盖选择器表达式的类型。casecasee
这里的关键点是非空。
在您的情况下,包含出现在不受保护的案例标签中的案例模式的集合是空的。
边注:
在实现模式、instanceof 和 switch 中的 JEP 455 基元类型后,如果使用嵌套模式bool直接访问值,则 switch 语句可能会很详尽(请参阅下面来自 davidalayachew 的评论)。
| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |