为什么我不能在案例标签中获得Enum常量引用?

mal*_*eki 41 java enums

为什么在将case语句更改为时,以下代码无法编译

case ENUM1: doSomeStuff();
Run Code Online (Sandbox Code Playgroud)

作品?

public enum EnumType
{
    ENUM1, ENUM2, ENUM3;

    void doSomeStuff()
    {
        switch(this)
        {
        case EnumType.ENUM1: doSomeStuff();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 33

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

更新:它实际上是为了保持二进制兼容性.以下是JLS 第13.4.9节中的一个引用:

要求内联常量的一个原因是switch 语句需要每个常量case,并且没有两个这样的常量值可能是相同的.编译器switch在编译时检查语句中的重复常量值; 该class 文件格式没有做的情况下价值观的象征性的联系.

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

  • 嗯......我不是100%相信.对于`OtherEnumType.ENUM1`,(Eclipse)编译器给出`类型不匹配:不能从OtherEnumType转换为EnumType`,而对于'EnumType.ENUM1`它给出`必须用非限定枚举常量ENUM1替换合格的案例标签EnumType.ENUM1 `.所以对我来说,似乎禁止类型限定符与检测类型不匹配无关. (2认同)
  • 这个答案没有充分解释.应该对如何重写进行一些解释. (2认同)

Jör*_*ann 29

这并没有真正回答你的问题,但如果你有代码取决于枚举值,你还可以在你的枚举中创建一个抽象方法,为每个值重载:

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

    public abstract void doSomeStuff();
}
Run Code Online (Sandbox Code Playgroud)


Col*_*inD 20

由于您正在打开一个类型的对象,EnumType并且唯一可能的值是枚举常量,因此无需在交换机中再次限定这些常量.毕竟,case OtherEnumType.ENUM1:无论如何进入它都是违法的.