与 JEP 406 相比,为什么 JEP 433 削弱了受保护模式的优势检查

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

这个问题解决了“

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 433(第二次预览版,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 中找不到解释。官方有评论吗?

java switch-statement jep
1个回答
0
投票

“因为这通常是不可判定的”已经足够解释了。

如果我们不能保证其正确性,就没有理由进行检查。

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