java - 为什么 "final static int"可以用作开关的大小写常数,但不能用作 "final static <your enum>"

标签 java enums constants case switch-statement

为什么这个 int 开关有效:


public class Foo {
    private final static int ONE = 1;
    private final static int TWO = 2;

    public static void main(String[] args) {
        int value = 1;
        switch (value) {
            case ONE: break;
            case TWO: break;
        }
    }

}

虽然这个枚举开关不是:


import java.lang.annotation.RetentionPolicy;

public class Foo {
    private final static RetentionPolicy RT = RetentionPolicy.RUNTIME;
    private final static RetentionPolicy SRC = RetentionPolicy.SOURCE;

    public static void main(String[] args) {
        RetentionPolicy value = RetentionPolicy.RUNTIME;
        switch (value) {
            case RT: break;
            case SRC: break;
        }
    }

}

我知道这种情况下发生的事情必须是一个常量,那么为什么我可以使用“final static int”作为常量而不是“final static ”?

最佳答案

因为 case 语句标签必须具有编译时常量或 EnumConstantName。 JLS 14.11

编译时间常数只能是字符串和原始类型,如 JLS 15.28 所述.因此,您不能使用静态 final ,因为它既不是编译时常量,也不是枚举名称。

关于java - 为什么 "final static int"可以用作开关的大小写常数,但不能用作 "final static <your enum>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4401743/

相关文章:

java - 难以理解代码,特别是 &

java - 无法使用 Maven 运行 npm grunt bower

java - 如何获取在类中声明为映射的常量

java - 通过在java中模拟命令shell如何执行一个文件?

Java 异步正在阻塞?

java - 解释 Enum 声明中使用的泛型

if-statement - 当我不关心 `if` 语句中包含什么值时,如何使用枚举?

c++ - 在类型中使用枚举 - 编译器警告 C4482 C++

c++ - 为什么在某些情况下 cv 限定符会从函数返回类型中删除?

iphone - iPhone:UI元素的坐标和大小的常量吗?