【问题标题】:constant expression required in switch with string带字符串的 switch 中需要的常量表达式
【发布时间】:2019-10-16 11:01:23
【问题描述】:

我已经声明了这个枚举类:

public enum class RoleName {
    Worker,
    Boss
}

我想在 switch / case 中使用它

switch (requestRole.getName()) {
    case RoleName.Worker.name():

但是我有这个编译错误

constant expression required 

如果我删除 class 我得到这个 IntelliJ IDEA 错误:'class' keyword is expected after 'enum;

【问题讨论】:

  • enum 不是enum class
  • 将您的 RoleName.Worker.name() 更改为“Worker”
  • 这真的是您在删除class 时收到的错误消息吗?正是这些词?
  • 您是否试图将包含RoleName 常量名称的字符串转换为实际的RoleName 对象?
  • @Sandro 我看到你在这个问题上提出了另一个问题并删除了它,请随时问这里还有什么不清楚的地方 - 我会更新我的答案

标签: java enums switch-statement constant-expression


【解决方案1】:

这里有两个错误:

  1. 枚举的定义中不应包含class。根据经验,常量应该是大写的。

    enum RoleName {
        WORKER,
        BOSS;
    }
    
  2. RoleName.Worker.name() 不允许作为 case 表达式,因为它不是 a constant expression。您可以将requestRole.getName() 转换为RoleName 并将其用作a switch expression

    switch (RoleName.valueOf(requestRole.getName())) {
        case WORKER: /* ... */ break;
    }
    

【讨论】:

  • #2 不是完全相同的代码,因为如果 requestRole.getName() 的值与枚举名称不匹配,则问题代码将起作用(如果有,请转到 default),并且此代码将抛出IllegalArgumentException
  • 我一直在寻找有效的 DUP 候选人……但是,所有这些问题都略有不同。让它成为 switch case 调用方法的 DUP 候选!
  • @CarlosHeuberger 因为requestRole 不是RoleName
  • @CarlosHeuberger getName 不是枚举方法
  • 其实是case WORKER:。 Java 不允许在 case 语句中使用限定的枚举常量。
猜你喜欢
  • 2015-11-02
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多