首先我要声明的是,我更熟悉c#中的枚举,而java中的枚举似乎是相当混乱的。

正如你所看到的,我试图在下一个例子中使用一个switch语句@ enums,但无论我做什么,我总是得到一个错误。

我收到的错误是:

限定的案例标签为SomeClass.AnotherClass.MyEnum。VALUE_A必须替换为不合格的enum常量VALUE_A

事情是我很理解这个错误,但我不能只写VALUE_A,因为enum位于另一个子类。有办法解决这个问题吗?为什么会发生在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;
            }
        }
    }
}

当前回答

这样编写someMethod():

public void someMethod() {

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

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

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

其他回答

这应该是:

//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;
            }
        }
    }
}

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
}

错误的:

case AnotherClass.MyEnum.VALUE_A

正确的:

case VALUE_A:

这就是我使用它的方式。而且效果非常好

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;
        }
    }

开关箱如下图所示

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

改成这样:

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

线索就在错误中。你不需要用enum类型限定case标签,只需要限定它的值。