为什么我得到一个枚举常量引用无法在案例标签中被限定?

为什么下面的代码无法编译,而更改case语句

case ENUM1: doSomeStuff(); 

作品?

 public enum EnumType { ENUM1, ENUM2, ENUM3; void doSomeStuff() { switch(this) { case EnumType.ENUM1: doSomeStuff(); } } } 

这是为了避免与不同枚举types进行比较的能力。 将其限制为一种types,即switch语句中的枚举值的types是有意义的。

更新 :它实际上保持二进制兼容性。 以下是JLS 第13.4.9章中的一个例子 :

要求内联常量的一个原因是switch语句在每种case都需要常量,并且没有两个这样的常量值可能是相同的。 编译器在编译时检查switch语句中重复的常量值; class文件格式不做案例值的符号链接。

换句话说,由于EnumType.ENUM1中的类标识符,它不能被表示为编译时常量expression式,而switch语句则需要它。

这不是真的回答你的问题,但如果你有代码取决于枚举值,你也可以在你的枚举中创build一个抽象的方法,获取每个值的重载:

 public enum EnumType { ENUM1 { @Override public void doSomeStuff() { // do something } }, ENUM2 { @Override public void doSomeStuff() { // do something else } }; public abstract void doSomeStuff(); } 

既然你打开了一个EnumTypetypes的对象,并且唯一可能的值是枚举常量,那么就不需要再在这个开关内限定这些常量了。 毕竟,在case OtherEnumType.ENUM1: ,无论如何都是非法的。