我开始玩新的Java 21功能-pattern matching.

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

从我的Angular 来看,这不一定是真的.所以我的问题是:是否有任何保护模式总是使Switch表达式对于编译器来说不是穷举的,或者我在这里遗漏了什么?

推荐答案

是否有任何保护模式总是使Switch表达式对于编译器来说不是穷举的,或者我在这里遗漏了什么?

不,这并不是说"any个有保护模式使Switch语句不是穷举的",但必须有at least个覆盖该类型的无保护模式.如果没有any个这样的无戒备模式,它就不是穷尽的.

更正式地说(见JLS 14.11.1.1. Exhaustive Switch Blocks),

如果出现以下情况之一,则switch表达式或switch语句的Switch块对于 Select 器表达式e是穷举的:

  • 有一个与switch 块关联的default标签.

  • 有一个与switch 块关联的case null, default标签.

  • set containing all the个常量和100 patterns appearing个常量 in an unguarded 100 label(统称为case个元素) 与switch 块is non-empty相关联,并且覆盖 Select 符表达式e.

这里的关键点是non-empty.

在你的情况下是set containing the case patterns appearing in an unguarded case label is 100.


附注:(用谷歌翻译翻译)

在实现JEP 455 Primitive types in Patterns, instanceof, and switch之后,如果使用嵌套模式直接访问bool值(请参阅davidalayachew下面的注释),那么Switch语句可能是详尽的.

Java相关问答推荐

在现代操作系统/硬件上按块访问数据值得吗?

Java模式匹配记录

需要一个找不到的jakarta.sistence.EntityManager类型的Bean

如何判断一个矩阵是否为有框矩阵?

RichFaces 3.x-Spring Boot-迁移web.xml

是否在允许数组元素为空时阻止 idea 为空性警告?

当返回Mono<;Something>;时,不会调用Mono<;void>;.flatMap

带错误BER验证的itext8签名返回pdf

支持MySQL 5.6的最新Hibernate版本

使用Jackson库反序列化json

Java Telnet客户端重复的IAC符号

从映射列表中检索所有键

Spring动态反序列化JSON可以是列表,也可以只是一个对象

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

ReturnedRect在升级后反转

简化每个元素本身都是 map 列表的列表

如何组合Mono和Flux

ANTLR 接受特殊字符,例如 .标识符或表达式中的(点)和 ,(逗号)

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为

睡眠在 Spring Boot 中