Java 为什么我得到的枚举常量引用不能在事例标签中限定?

Java 为什么我得到的枚举常量引用不能在事例标签中限定?,java,enums,Java,Enums,为什么将case语句更改为时以下代码无法编译 case ENUM1: doSomeStuff(); 工作 public enum EnumType { ENUM1, ENUM2, ENUM3; void doSomeStuff() { switch(this) { case EnumType.ENUM1: doSomeStuff(); } } } 这是为了避免对不同的枚举类型进行比较。将其限制为

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

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对你的案子做了调查。要详细了解枚举上此限定符问题的解决方案(使用工作示例),请参阅