Java 为什么我得到的枚举常量引用不能在事例标签中限定?
为什么将case语句更改为时以下代码无法编译Java 为什么我得到的枚举常量引用不能在事例标签中限定?,java,enums,Java,Enums,为什么将case语句更改为时以下代码无法编译 case ENUM1: doSomeStuff(); 工作 public enum EnumType { ENUM1, ENUM2, ENUM3; void doSomeStuff() { switch(this) { case EnumType.ENUM1: doSomeStuff(); } } } 这是为了避免对不同的枚举类型进行比较。将其限制为
case ENUM1: doSomeStuff();
工作
public enum EnumType
{
ENUM1, ENUM2, ENUM3;
void doSomeStuff()
{
switch(this)
{
case EnumType.ENUM1: doSomeStuff();
}
}
}
这是为了避免对不同的枚举类型进行比较。将其限制为one类型是有意义的,即switch
语句中枚举值的类型
更新:实际上是为了保持二进制兼容性。以下是来自JLS大约一半的引用:
要求内联常量的一个原因是switch
语句要求每个案例
上都有常量,并且没有两个这样的常量值是相同的。编译器在编译时检查switch
语句中是否存在重复的常量值;类
文件格式不进行大小写值的符号链接
换句话说,由于
EnumType.ENUM1
中的类标识符,它不能表示为compiletime常量表达式,而switch
语句需要它。因为您正在切换类型为EnumType
的对象,并且它唯一可能的值是enum常量,不需要在开关中再次限定这些常量。毕竟,在其中包含case OtherEnumType.ENUM1:
是非法的。这并不是真正回答您的问题,但如果您的代码取决于枚举值,您还可以在枚举中创建一个抽象方法,该方法会为每个值重载:
public enum EnumType {
ENUM1 {
@Override
public void doSomeStuff() {
// do something
}
},
ENUM2 {
@Override
public void doSomeStuff() {
// do something else
}
};
public abstract void doSomeStuff();
}
我认为这可能是确切的情况。尝试使用“case enum:”而不是“case OtherEnumType.enum”来使用OtherEnumType中的枚举会产生与您描述的错误相近的错误。用作开关的
case
分支的操作数的常量名称必须是非限定的,因此您需要在类定义中使用静态导入来实现这种情况,如果你不是写枚举的人。嗯。。。我不是100%相信。到OtherEnumType.ENUM1
(Eclipse)编译器提供了类型不匹配:无法从OtherEnumType转换为EnumType
,而到EnumType.ENUM1
它提供了限定的大小写标签EnumType.ENUM1必须替换为非限定的enum常量ENUM1
。所以在我看来,禁止类型限定符似乎与检测类型不匹配无关。这个答案并不能充分解释它。应该有一些关于如何重写的解释。最佳答案+1。此技术在添加新值时提供了更高的安全性,因为与缺少case语句相比,您不会忘记添加方法实现。提示:如果可以提供有意义的默认实现,则无需将doSomeStuff抽象化。如果您有有有意义的默认情况,然后把它作为默认情况放在你的开关里。回答得真棒!我已经做Java很多年了,但我从来没有听说过这个特性:哦,恭喜,Jörn!:DWould“java有缺陷,不要真正试图理解这一点”是一个合理的答案吗?我的意思是,这里的答案非常详细,但在这种情况下,我认为它们并不重要+1个问题,-1个JAVA…@ColinD对你的案子做了调查。要详细了解枚举上此限定符问题的解决方案(使用工作示例),请参阅