如何在switch case语句中使用枚举

33

我正在尝试检查我的VO中设置了哪些值。

以下是我的类。我收到了"限定的 case 标签 MyEnum.UserType.DOCTORS 必须替换为非限定的枚举常量 DOCTORS"的错误提示。

请帮我确定我在这里做错了什么。

MyEnum.java

public MyEnum{
    private UserType userType;

    public UserType getUserType(){
        return userType;
    }

    public void setUserType(UserType userType){
        this.userType = userType;
    }

    public static enum UserType{
        DOCTORS("D"),
        PATIENT("P"),
        STAFF("S");
    }

}

EnumTest.java

public EnumTest {

    .....
    public void onGoBack(MyEnum myEnum) {

        switch(myEnum.getUserType())
        {
            case UserType.DOCTORS: // this shows "The qualified case label MyEnum.UserType.DOCTORS must be replaced with the unqualified enum constant DOCTORS"
                break;

        }
    }

}

5
建议尝试使用 case DOCTORS:,就像编译器所建议的那样。 - John Dvorak
2
为什么不尝试按照错误信息所提示的去做呢? - fge
6
我发现在SO上至少有一次提出这个问题很有用,而点赞数量意味着人们同意我的看法。这种语法相当不寻常,当您处于定义常量的类之外时,可以使用未经限定的常量名称。 - Tristan
4
这个错误还包含一些非常专业的术语,许多人可能不会立刻理解。 - Vervious
1个回答

55
由于编译器知道您在switch语句中正在评估的枚举类型,因此应该删除“qualified”部分,就像错误提示建议的那样(在您的情况下:MyEnum.UserType.),并简单地使用“unqualified”枚举DOCTORS。请参见以下内容:
switch(myEnum.getUserType())
{
    case DOCTORS: 
        break;
}

2
真的比在SO上发布问题并等待答案更难读取错误消息吗?:/ - Matt Ball
1
如果在另一个类中有另一个被称为相同的常量,该怎么办?在这种情况下,“DOCTORS”不是会产生歧义吗? - HelloGoodbye
1
@HelloGoodbye 不会有歧义,因为编译器确切地知道 switch 表达式评估的枚举类型。 - Matt Ball
8
马特·鲍尔,我们都具有不同的经验水平。不需要责备或蔑视那些感谢你帮助的人。让我们保持专业。这个用户花时间提出问题,可能只是需要一点指导去解释错误消息。我个人正在学习Java,我来这里也只是因为对于这个异常而言并不知道答案。 - Justin Russo
5
Matt Ball,我认为这个问题是合理和有意义的。考虑到我们可以在Java的其他任何地方使用MyEnum.ABCMyEnum.XYZ,我很惊讶和困惑地发现在switch-case中使用相同的语法是非法的。 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接