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

我有一节课

public class Game {


    static class GameMode {
        public static final GameMode SURVIVAL = new GameMode();
        public static final GameMode ADVENTURE = new GameMode();
        public static final GameMode GOD = new GameMode();
    }

    GameMode CurrentMode = GameMode.GOD;

}

但当我定义switch语句时,它会给我一个错误:

    void OnGame(){
        switch (CurrentMode){
            case GameMode.GOD: // case expressions must be constant expressionsJava(536871065)
                System.out.println("Player On God Mode");
                break;
            case GameMode.SURVIVAL: // case expressions must be constant expressionsJava(536871065)
                System.out.println("Player On Survival Mode");
                break;
            case GameMode.ADVENTURE: // case expressions must be constant expressionsJava(536871065)
                System.out.println("Player On Adventure Mode");
                break;


        }
    }

这让我很困惑.生存、冒险和god 模式都是不变的,我在前面加上"final",为什么我不能在switch语句中使用它呢?

Here are some image: enter image description here enter image description here enter image description here

推荐答案

根据Java Language Specification(JLS):

case 标签有一个或多个 case 常量.每个case常量必须是常量表达式(§15.29)或枚举常量的名称(§8.9.1),否则会发生编译时错误.

你的 case 显然不是enum constant,所以我猜你是在try 使用constant expression,但你的GameMode类不符合constant expression.

常量表达式是一个表示原语类型的值或字符串的表达式,它不会突然完成,只使用the following...

Java相关问答推荐

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

Java函数式编程中的双值单值映射

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

Java .类参数不通过构造函数传递

为什么在枚举中分支预测比函数调用快?

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

为什么在maven中,getLast方法不适用于List?

测试期间未执行开放重写方法

Bean定义不是从Spring ApplationConext.xml文件加载的

无法使用ApacheSpark依赖项构建JavaFX应用程序

在Java中将int[]矩阵添加到ArrayList中,但出现错误

如何在右击时 Select 新行?

使用同步方法中的新线程调用同步方法

当我将JTextField的getText函数与相等的String进行比较时;t返回true

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

JavaFX中ListView中的问题

将Optionals/null安全添加到嵌套的flatMap/流

ExecutorService:如果我向Executor提交了太多任务,会发生什么?