当前位置: 首页 > 知识库问答 >
问题:

Java 19模式匹配编译错误:“switch语句没有覆盖所有可能的输入值”

韩淇
2023-03-14

使用Brian Goetz的文章:https://www.infoq.com/articles/data-oriented-programming-java/

sealed interface Opt<T> { 
    record Some<T>(T value) implements Opt<T> { }
    record None<T>() implements Opt<T> { }
}
Opt<String> optValue = doCalc(value);
switch (optValue) {
    case Opt.Some<String>(String s) -> System.out.printf("got string: %s%n", s);
    case Opt.None<String>() -> System.out.printf("got none with value: %d%n", value);
};

使用OpenJDK运行时环境(build 19-ea 27-2074),我得到编译错误:开关语句没有涵盖所有可能的输入值

我可以添加一个默认的case语句,程序就可以运行了。然而,我认为对于密封的记录,给定的switch case将是详尽无遗的,编译器应该认识到默认情况是不必要的。

共有1个答案

赫连法
2023-03-14

JDK 19现在只有早期的Access版本可用。

我想我在JEPS 427留档中找到了这个问题的重要部分

也可以从此处跟踪模式匹配(第三次预览)的进度。

根据下面的JEPS示例,我认为这是可行的,所以我认为您应该先等待第一个JDK 19构建的正式可用性,然后再试一次。如果它仍然不起作用,那么我认为您应该继续并将其作为bug报告。

当允许的直接子类只实现(泛型)密封超类的特定参数化时,需要格外小心。例如:

sealed interface I<T> permits A, B {}
final class A<X> implements I<String> {}
final class B<Y> implements I<Y> {}

static int testGenericSealedExhaustive(I<Integer> i) {
    return switch (i) {
        // Exhaustive as no A case possible!
        case B<Integer> bi -> 42;
    }
}

I的唯一允许子类是A和B,但编译器可以检测到开关块只需要覆盖类B即可详尽无遗,因为选择器表达式是类型I。

我还认为@Kayaman的评论并非如此,因为文档中明确说明了如何安全处理该案件。

为了防止不兼容的单独编译,在切换到一个密封类的情况下,如果开关块是穷举的,并且没有匹配所有的情况,编译器会自动添加一个默认标签,其代码会引发不兼容的ClassChangeError。只有更改密封接口且未重新编译交换机代码时,才能访问此标签。实际上,编译器为您强化了代码。

 类似资料:
  • 我一定错过了什么。我正在计算一个列表,想跳过特定的数字,所以我做了一个switch语句: 以下是输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 44 45 46 47 48 50 52 53 注意,44出现了,尽管我没

  • 使用OpenJDK 14.0.1 编译失败,出现“开关表达式未覆盖所有可能的输入值”。如果我从ExampleEnum中删除InnerEnum,代码就会编译。为什么此内部枚举的存在会导致switch表达式失败?是否有逻辑解释或编译器错误?

  • 在这段代码中有一个编译时错误。 "Example.java:17:错误:变量y可能没有被初始化"。 谁能解释一下这个错误的原因以及如何修复它?

  • 在这段代码中有一个编译时错误。 "Example.java:17:错误:变量y可能没有被初始化"。 谁能解释一下这个错误的原因以及如何修复它?

  • 本文向大家介绍Swift中switch语句区间和元组模式匹配,包括了Swift中switch语句区间和元组模式匹配的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,下面一段代码给大家介绍了switch语句区间和元组模式匹配,具体内容如下所示: 以上所述是小编给大家介绍的Swift中switch语句区间和元组模式匹配,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此

  • 我的任务是创建一个名为MyRectangle的类来表示矩形。 所需的数据字段是宽度、高度和颜色。宽度和高度使用双数据类型,颜色使用字符串。然后编写一个程序来测试MyRectangle类。在客户端程序中,创建两个MyRectangle对象。为两个对象中的每一个指定宽度和高度。将第一个对象指定为红色,将第二个对象指定为黄色。显示两个对象的所有属性,包括其面积。 我已经写了所有的东西,没有错误,但是无论