这个问题解决了“
switch
的模式匹配”的不同 JEP 之间的差异
在 JEP 406(第一次预览,Java 17)中,会稍微检查受保护模式中的条件是否正确的主导顺序:
形式 case p 的模式标签支配形式 case p && e 的模式标签,即,其中模式是原始模式的受保护版本。例如,模式标签 case String s 支配模式标签 case String s && s.length() > 0,因为与受保护模式 String s && s.length() > 0 匹配的每个值也与模式 String s 匹配。
编译器检查所有模式标签。如果 switch 块中的模式标签由该 switch 块中较早的模式标签主导,则这是一个编译时错误。
在 JEP 420(第二个预览版,Java 18)中,这些检查已被删除:
如果受保护的模式标签所包含的标签主导常量标签,则该标签主导常量标签;我们不检查保护表达式,因为这通常是不可判定的。
因此,虽然这会在 Java 17 中生成编译器错误:
static void dominanceExampleWithConstant(Object obj) {
switch (obj.toString()) {
case String str when str.length() > 5 -> System.out.println(str);
case "Sophie" -> System.out.println("My lovely daughter");
default -> System.out.println("FALLBACK");
}
}
Java 18 中不再这样做。
我的问题:为什么这个被删除了?我在 JEP 中找不到解释。官方有评论吗?
“因为这通常是不可判定的”已经足够解释了。
如果我们不能保证其正确性,就没有理由进行检查。