为什么枚举值不能在 switch 语句中完全限定?

2022-09-01 23:50:09

(注:编辑过的问题;事先的意图不明)

请考虑以下代码:

public final class Foo
{
    private enum X
    {
        VALUE1, VALUE2
    }

    public static void main(final String... args)
    {
        final X x = X.VALUE1;

        switch (x) {
            case VALUE1:
                System.out.println(1);
                break;
            case VALUE2:
                System.out.println(2);
        }
    }
}

此代码工作正常。

但是,如果我替换:

case VALUE1: // or VALUE2

跟:

case X.VALUE1: // or X.VALUE2

然后编译器会抱怨:

java: /path/to/Foo.java:whatever: 枚举开关大小写标签必须是枚举常量的非限定名称

SO用JLS的这句话提出了一个答案

(要求内联常量的一个原因是,switch 语句在每种情况下都需要常量,并且没有两个这样的常量值可能相同。编译器在编译时检查 switch 语句中是否存在重复的常量值;类文件格式不执行事例值的符号链接。

但这并不能满足我。就我而言,它们完全相同。引用的文字根本没有为我解释它。VALUE1X.VALUE1

在JLS中,哪里定义了语句中的值必须以这种方式编写?enumswitch


答案 1

SwitchLabel需要一个 EnumConstantName,它被定义为 enum 常量标识符,它是不限定的

EnumConstant:
Annotationsopt Identifier Argumentsopt ClassBodyopt


答案 2