Java:在子类下使用带有enum的switch语句


265

首先,我要说的是,我对C#中的枚举更加熟悉,而Java中的枚举似乎相当混乱。

如您所见,我在下一个示例中尝试使用switch语句@枚举,但是无论我在做什么,我总是会收到错误消息。

我收到的错误是:

合格的案例标签SomeClass.AnotherClass.MyEnum.VALUE_A必须替换为不合格的枚举常量VALUE_A

事情是我理解错误,但是我不能只写VALUE_A,因为枚举位于另一个子类中。有办法解决这个问题吗?以及为什么它在Java中发生?

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        MyEnum enumExample //...

        switch (enumExample) {
            case AnotherClass.MyEnum.VALUE_A: { <-- error on this line
                //..
                break;
            }
        }
    }
}

正如darrengorman所评论的那样,一旦掌握了Java,Enum它们就非常方便-一点也不乱。与在其他平台上看到的简单枚举(仅是标记的整数值)相比,它们更具灵活性和实用性。请参阅《Oracle教程》。探索优化的Set/ Map实施:EnumSetEnumMap
罗勒·布尔克

1
当您试图使案例陈述合格时;在某种程度上,您试图说我可以在单个switch语句中混合使用不同类型的枚举(不只是相同的枚举类型)。Java已使用此方法停止了此操作,如此处所述digizol.com/2010/10/enum-case-label-switch-java-qualified.html
lkamal

这是我在IntelliJ 2018.2中重构(移动)类时发生的事情
Daniel Alder

Answers:


570

更改为此:

switch (enumExample) {
    case VALUE_A: {
        //..
        break;
    }
}

线索出在错误中。您不需要case使用枚举类型限定标签,只需使用其值即可。


20
好吧,我觉得这么愚蠢:-(你是完全正确的,我确信我想这确切的行,并与得到了一个错误,所以我搬到了出线的情况下,但你的建议确实工作。
Popokoko

4
顺便说一句,我认为您会发现Java枚举在您开始更多地使用后会非常有用,我不会说它们完全是一团糟:)
darrengorman 2012年

11
@milkplusvellocet,我知道这篇文章已经很老了,但是我很好奇为什么Java 在switch语句中不允许使用限定的大小写标签
jzarsuelo 2013年

3
@ cRane01不确定,但是它使语法更简洁。在每种情况下指定类型都是完全多余的
darrengorman 2013年

3
@HelloGoodbye否。switch语句的变量定义case语句的类型,因此只能是一个枚举。
短跑选手

33

Java会自动推断中的元素类型case,因此标签必须是不合格的。

int i;
switch(i) {
   case 5: // <- integer is expected
}
MyEnum e;
switch (e) {
   case VALUE_A: // <- an element of the enumeration is expected
}

14
为什么必须不合格?
托尔比约恩Ravn的安德森

11
如果您有资格,那么您可以使用MyEnum没有意义的其他东西。
2015年

1
@Kru,但是我可以对非枚举类型的case表达式使用语法上其他的东西。例如,static final int MY_CONST = 7; …; switch(intVariable) {case MY_CONST: …;}而不是case 7。因此,这种对枚举的限制没有任何意义(我不仅可以使用基本文字,还可以将手动定义的常量用于整数switch表达式,但是不能使用手动定义的常量,而只能将基本名称用于枚举)。
萨沙

4

这应该做:

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //...

        switch (enumExample) {
            case VALUE_A: { //<-- error on this line
            //..
            break;
            }
        }
    }
}

您节省了一天!
Soham Mehta,


2

这就是我的使用方式。它的运行非常出色-

public enum Button {
        REPORT_ISSUES(0),
        CANCEL_ORDER(1),
        RETURN_ORDER(2);

        private int value;

        Button(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }

switch-case如下图所示

@Override
public void onClick(MyOrderDetailDelgate.Button button, int position) {
    switch (button) {
        case REPORT_ISSUES: {
            break;
        }
        case CANCEL_ORDER: {
            break;
        }
        case RETURN_ORDER: {
            break;
        }
    }
}

0

这样写someMethod()

public void someMethod() {

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A;

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

在switch语句中,您只能使用常量名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.