为什么“最终静态int”可以用作开关的大小写常数,而不能用作“最终静态<您的枚举>”

2022-09-02 09:50:04

为什么此 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;
        }
    }

}

我知道在这种情况下,必须是什么常量,那么为什么我可以使用“最终静态int”作为常量,而不是“最终静态<你的枚举>”?


答案 1

因为事例语句标签必须具有编译时常量或枚举常量名称。JLS 14.11

编译时常量只能是字符串和基元类型,如 JLS 15.28 所述。因此,您不能使用静态的最终<您的枚举>,因为它既不是编译时常量,也不是枚举的名称。


答案 2

case 参数必须是原始的;它不能是一个对象。

但是,您可以按如下方式使用枚举:

RetentionPolicy value = ...
switch (value) {
    case RUNTIME:
    case SOURCE:
}

由于 被声明为类型,因此您可以直接在开关中使用枚举常量。valueRetentionPolicy


推荐