Java 21 保护模式详尽性

问题描述 投票:0回答:1

我开始尝试 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 表达式不详尽,或者我在这里遗漏了一些东西?

java pattern-matching java-21
1个回答
0
投票

任何受保护的模式是否总是使编译器的 switch 表达式不详尽,或者我在这里遗漏了一些东西?

不是任何受保护的模式...但必须有至少一个不受保护的模式覆盖该类型。如果不存在任何这样的不受保护的模式,那么它就不是详尽无遗的。

更正式(请参阅JLS 14.11.1.1.详尽的开关块),

如果满足以下情况之一,则 switch 表达式或 switch 语句的 switch 块对于选择器表达式 e 来说是详尽的:

  • switch 表达式或 switch 语句的 switch 块是 如果满足以下情况之一,则详尽选择器表达式 e 适用:

  • 有一个与开关块关联的默认标签。

  • 有一个 case null,与开关块关联的默认标签。

  • 包含所有案例常量和出现的案例模式的集合 在不受保护的案例标签中(统称为案例元素) 与开关块关联非空并涵盖以下类型 选择器表达式 e.

这里的关键点是非空

在您的情况下,包含出现在不受保护的案例标签中的案例模式的集是

© www.soinside.com 2019 - 2024. All rights reserved.