我无法使用未涵盖所有可能情况的 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
,但没有用。
似乎应该有一个允许这样做的注释。
我知道可以重写代码来解决这个问题,但为什么不能解决这个问题?
这里不需要三元运算符。如果你传入 null
,Optional.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 块,编译器应该假定开关解析为什么?
如果您说:但这不可能发生 - 好吧,编译器不知道这一点,并且可能会发生疯狂的事情。充其量你会假设编译器会抛出一些东西,但是,好吧,规范说它不是这样工作的。
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
,但没有用。
似乎应该有一个允许这样做的注释。
我知道可以重写代码来解决这个问题,但为什么不能解决这个问题?
这里不需要三元运算符。如果你传入 null
,Optional.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 块,编译器应该假定开关解析为什么?
如果您说:但这不可能发生 - 好吧,编译器不知道这一点,并且可能会发生疯狂的事情。充其量你会假设编译器会抛出一些东西,但是,好吧,规范说它不是这样工作的。