我开始尝试 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) { }
}
编译上面的代码时,编译器会产生以下信息:
the switch statement does not cover all possible input values
从我的角度来看,这不一定是真的。所以这是我的问题:任何受保护的模式是否总是使编译器的 switch 表达式不详尽,或者我在这里遗漏了一些东西?
任何受保护的模式是否总是使编译器的 switch 表达式不详尽,或者我在这里遗漏了一些东西?
不是任何受保护的模式...但必须有至少一个不受保护的模式覆盖该类型。如果不存在任何这样的不受保护的模式,那么它就不是详尽无遗的。
更正式(请参阅JLS 14.11.1.1.详尽的开关块),
如果满足以下情况之一,则 switch 表达式或 switch 语句的 switch 块对于选择器表达式 e 来说是详尽的:
switch 表达式或 switch 语句的 switch 块是 如果满足以下情况之一,则详尽选择器表达式 e 适用:
有一个与开关块关联的默认标签。
有一个 case null,与开关块关联的默认标签。
包含所有案例常量和出现的案例模式的集合 在不受保护的案例标签中(统称为案例元素) 与开关块关联非空并涵盖以下类型 选择器表达式 e.
这里的关键点是非空。
在您的情况下,包含出现在不受保护的案例标签中的案例模式的集是空。