-2

我必须使用一个定义这样的枚举的库:

public static enum LibVal {
    VAL_1,
    VAL_2,
    VAL_3;
}

我将此枚举作为方法参数:

public void libCallback(LibVal val){
    //.... some implementation
}

为什么 Java 不允许在方法中使用switchwithLibVal枚举libCallback?但是,如果 lib 已将其枚举声明为非静态,它将起作用。这很令人困惑,因为这个SO-answer指出,真的没有区别......

编辑:

正如 bobkilla 所说:我在我的开关中尝试了 LibVal.VAL_1,这应该是允许的。我提供了一个不起作用的代码示例!

class TestClassForEnum {
    public static enum TestEnum{ ONE, TWO; }
}

class WhichUsesEnumInsideMethod{

    //completely unrelated to TestClassForEnum.TestEnum!!!
    public static final int ONE = 0x1282

    void doSomethingWithEnum(TestEnum e){
        //here I cannot switch:

        //FORBIDDEN BY JAVA
        switch (e) {
            case TestEnum.ONE:
                    //...

        }

        //Cannot USE EITHER, because ONE is a static final int inside this scope?!:
        switch (e) {
            case ONE:
                    //...

        }

 }
4

3 回答 3

5

这不起作用:

switch(val) {
            case LibVal.VAL_1: System.out.println("VAL_1 was chosen");
        }

这将起作用:

switch(val) {
            case VAL_1: System.out.println("VAL_1 was chosen");
        }
于 2013-05-13T11:59:07.330 回答
2

默认情况下,所有枚举都是静态的,没有区别。您可以打开任何枚举,无论是否将其设为静态。

在此处查看此示例http://ideone.com/n5oQoi

public class Main {
    public static enum LibVal {
        VAL_1,
        VAL_2,
        VAL_3;
    }

    public void libCallback(LibVal val){
        switch(val) {
            case VAL_1: System.out.println("VAL_1 was chosen");
        }
    }

    public static void main(String[] ignored) {
        new Main().libCallback(LibVal.VAL_1);
    }
}
于 2013-05-13T11:42:44.887 回答
1
// your method signature:
public void libCallback(LibVal val){
    switch (val) {
    case VAL_1: System.out.println("It"); break;
    case VAL_2: System.out.println("works"); break;
    case VAL_3: System.out.println("fine"); break;
    default:    System.out.println("here.");
    }
}
于 2013-05-13T11:45:22.723 回答