我正在 IntelliJ IDEA 2022.2 中使用 Java 17 进行开发。
在某些情况下会显示
'switch' expression does not cover all possible input values
,但在某些情况下不会显示。我想知道为什么。
假设
entityType
是一个具有 3 个值的 enum,我要添加第四个 TYPE_D
。因此,我希望在 'switch' expression does not cover all possible input values
中使用此枚举时看到 switch
错误。
显示时:
public Map<String, String> getRecordDetails() {
return switch (entityType) {
case TYPE_A -> Map.of("A","A");
case TYPE_B -> Map.of("B","B");
case TYPE_C -> Map.of("C","C");
};
}
未显示时:
public String getRecordDetails() {
StringBuilder stringBuilder = new StringBuilder();
switch (entityType) {
case TYPE_A -> stringBuilder.append("A");
case TYPE_B -> stringBuilder.append("B");
case TYPE_C -> stringBuilder.append("C");
};
return stringBuilder.toString();
}
当我返回
switch
case 时,我看到它是相关的,但是为什么当我在函数代码中有 switch case 时它没有显示?
当您使用
switch
作为 return
的一部分时,它是一个 switch 表达式。但是,如果您只是将 switch
随机放在方法中间,它会被解析为 switch 语句。这些有不同的规则。重要的是,切换表达式需要详尽无遗。
来自 Java 语言规范:
如果选择器表达式的类型不是枚举类型,则只有一个与 switch 块关联的默认标签。
如果选择器表达式的类型是枚举类型,则 (i) 与 switch 块关联的 case 常量集合包括枚举类型的每个枚举常量,并且 (ii) 至多有一个默认标签与 switch 块关联开关块。
另一方面,switch 语句没有这个限制。
直观地说,表达式必须计算出一个值,但语句不必这样做。因此,switch 表达式必须涵盖所有情况。如果不这样做,那么就会出现无法评估任何内容的情况。
在 Java 更高版本的预览规范中,“详尽开关”的概念得到了更明确的定义,因为它们现在需要支持模式匹配等功能。
如果 (i) switch 块包含默认 switch 标签,或者 (ii) 包含 switch 标签支持的所有不受保护的 case 元素的集合,则 switch 表达式或 switch 语句的 switch 块对于 T 类型的选择器表达式是详尽的开关块中的 T 是详尽的,其指定如下:[...]
然后稍后,
switch 表达式必须是详尽的 (14.11.1.1),否则会发生编译时错误。