我无法使用未涵盖所有可能情况的 switch 语句

I'm prevented from using a switch statement that doesn't cover all possible cases

return degrees % 90 != 0? Optional.empty() : Optional.of( switch( degrees ) {
            case 0 -> NORTH;
            case 90 -> EAST;
            case 180 -> SOUTH;
            case 270 -> WEST;
            //default -> null;  is there something I can put here to make empty Optional?
        } );

在 returns 之上,一个包含主要方向枚举的可选。该代码之前已确保这些是 degrees 的唯一 4 个可能值。但是 IntelliJ IDEA 不允许这样做,抱怨 switch 没有处理所有可能的值。 我已经搜索了一个 @SuppressWarnings 注释来允许这样做;我找到的最接近的是 SwitchStatementWithoutDefaultBranch,但没有用。

似乎应该有一个允许这样做的注释。

我知道可以重写代码来解决这个问题,但为什么不能解决这个问题?

这里不需要三元运算符。如果你传入 nullOptional.ofNullable 会给你一个 Optional.empty(),所以你可以这样做:

return Optional.ofNullable( switch( degrees ) {
            case 0 -> NORTH;
            case 90 -> EAST;
            case 180 -> SOUTH;
            case 270 -> WEST;
            default -> null;
        } );

有两种不同的开关结构。 switch 表达式和 switch 语句。 switch 表达式很新(在 JDK 中添加,嗯,14?不到 2 年前)。另一方面,switch 语句形式已有 25 年以上历史。

switch 语句形式具有 属性 如果您没有涵盖所有情况,许多 linting 工具和 IDE 会生成警告。

然而,这是关键,您正在使用 switch 表达式形式,java 规范 要求编​​译器可证明的详尽性。

换句话说,对于 switch 语句,非穷尽性很好并且不是错误甚至是 javac-spec-enforced 警告,但大多数 linters/IDEs 确实对此发出警告,但是您正在使用 switch 表达式形式。规范说必须在此处生成错误。没有 @SuppressWarnings 或任何其他可以设置为使 intellij 忽略规范要求的 intellij 设置。

原因很简单:您将此开关用作表达式,那么如果命中 none 个 case 块,编译器应该假定开关解析为什么?

如果您说:但这不可能发生 - 好吧,编译器不知道这一点,并且可能会发生疯狂的事情。充其量你会假设编译器会抛出一些东西,但是,好吧,规范说它不是这样工作的。