考虑以下代码:
enum MyEnum {
A, B, C;
}
int foo(MyEnum e) {
switch (e) {
case A:
return 1;
case B:
return 2;
case C:
return 3;
}
}
^ error: missing return statement
编译器不喜欢这样。将此示例与以下内容进行对比:
int bar() {
if (...) {
return 1;
} else {
return 2;
}
}
开关问题可以通过 default
解决情况,但你可能会说这里没有必要。所有枚举值都包含在 switch 的情况下。对 switch 语句进行静态分析是否知道,在详尽的 switch 中返回时, switch 语句后面的代码块是无法访问的?
我尝试查看 language spec ,但我没有看到这一点得到明确解决。
最佳答案
Java 并不像 C/C++ 或 .NET 等其他语言那样本地实现枚举。它们只是(最终)类的实例。因此,实际上您的运算符 ==
比较的是引用相等性,而不是您可能建议的整数值。
这就是 switch 语句不完整的原因。该引用可能只是null
。
此外,您可能已经使用公共(public)构造函数定义了自己的枚举类,该构造函数可能会创建任意数量的实例。
<小时/>顺便说一句:到目前为止,实现 foo
方法的最简单方法是
int foo(MyEnum e)
{ return e.ordinal() + 1;
}
但请注意,.ordinal()
不会返回与枚举常量关联的任何值。它只是按定义顺序排列的索引。
关于java - 枚举的详尽 switch 语句的静态分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50607799/