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

fge:

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

考虑以下代码:

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:枚举开关大小写标签必须是枚举常量的非限定名称

因此,建议使用 JLS的这句话作为答案

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

但这不令我满意。就我而言,VALUE1并且X.VALUE1完全一样。引用的文字对我完全没有解释。

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

亚述:

SwitchLabel需要一个EnumConstantName,它被定义为枚举常量标识符,标识符不合格

EnumConstant:
注释opt标识符参数opt ClassBody opt

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在枚举上的Java switch语句中,为什么在每种情况下限定我的值时都出现编译错误?

为什么在switch语句中有每个枚举常量的用例时,为什么仍必须提供默认值?

为什么不能在switch语句中声明变量?

为什么在switch语句中最终的Byte不能编译?

为什么在Java的switch语句中不能使用“ continue”?

为什么不能在switch语句中使用元组常量作为大小写

为什么最终变量不能在switch语句中使用?

为什么我们不能在 switch 语句中使用关系表达式?

VS Code中的JavaScript:为什么不能在“ switch”语句中折叠“ case”代码块?

为什么不能将GETDATE()用作过程参数的默认值或EXECUTE语句中的值?

为什么我不能在if-then语句中更改变量的值?

为什么switch语句中不是默认值的每种情况都属于例外情况?

为什么我不能将其他类的常量添加到 java 中的 switch 语句中?

为什么我不能在IF语句中嵌套SUBSTITUTE?

为什么不能在 if 语句中使用空指针?

为什么不能在if语句中声明变量?

为什么不能在DELETE语句中使用别名?

为什么不能在“ if”语句中的整数前加零

为什么在for循环的初始语句中不能声明多个变量?

为什么switch语句中的个案没有自己的范围?

为什么switch语句中的“ case”为负数缩进?

为什么不在switch语句中处理char?C ++

为什么从Powershell switch语句中的变量进行奇怪的赋值?

为什么对枚举的switch语句抛出“无法与类型相比”错误?

为什么在“ C#7.3”中不能由“枚举”限定的泛型类型?

我使用 swift 收到错误“字符串”无法匹配我的 Switch 语句中的值,为什么?

为什么不能在字符串上使用switch语句?

为什么我不能在类中放置 switch 语句

声明为内部类时,switch语句中的枚举值的行为