2012-04-15 94 views
157

首先我会说我更熟悉C#中的枚举,并且它看起来像java中的枚举是相当混乱的。Java:在子类中使用带有枚举的开关语句

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

我收到的错误是:

合格的情况下,标签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; 
      } 
     } 
    } 
} 
+0

作为darrengorman评论,爪哇['Enum'](http://docs.oracle.com/javase/8/

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 - 它是工作飞驰docs/api/java/lang/Enum.html)一旦得到它们的窍门,就非常方便 - 一点都不乱。与其他平台上看到的简单枚举(仅仅是一个带标签的整数值)相比,它们更加灵活和实用。请参阅[Oracle教程](http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)。发现优化的'Set' /'Map'实现:['EnumSet'](http://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html)&['EnumMap'] (http://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html)。 – 2017-08-05 20:12:57

+0

当您尝试限定案例声明时;在某种程度上,您试图说我可以在单个switch语句中混合不同类型的枚举(不仅仅是相同的枚举类型)。爪哇已经停止了这种方法,这里讨论http://www.digizol.com/2010/10/enum-case-label-switch-java-qualified.html – lkamal 2017-11-16 18:52:08

回答

362

它改成这样:

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

的线索是在错误。您不需要使用枚举类型标记case标签,仅限于其值。

+13

好吧,我觉得这么愚蠢:-( 你是完全正确的,我确信我尝试了这个确切的路线,并得到了一个错误,所以我搬到合格的情况下,但你的建议是否工作 – Popokoko 2012-04-15 11:09:09

+4

顺便说一下,你会发现,一旦你开始更多地使用它们,Java中的枚举是非常有用的,我不会说它们都是一团糟:) – darrengorman 2012-04-15 11:17:01

+0

我相信我会在近距离发现你是对的:)无论如何,这是绝对是最好的编程论坛,感谢像你这样的人。 – Popokoko 2012-04-15 11:20:16

21

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 
} 
+8

为什么_必须它是不合格的? – 2015-08-19 13:25:25

+8

如果你有资格,那么你可能会使用'MyEnum'以外的东西,这是没有意义的。 – Kru 2015-08-31 18:03:37

+0

@Kru,但我**可以**使用某些语法,否则用于非枚举类型的表达式。例如。'static final int MY_CONST = 7; ...; switch(intVariable){case MY_CONST:...;}''而不是'case 7'。因此,对枚举的这种限制使** no **有意义(我不仅可以使用主文字,还可以使用手动定义的常量来表示整型'switch'表达式,但我不能使用手动定义的常量,但只能使用主要名称枚举)。 – Sasha 2017-11-15 11:44:50

0

someMethod()这样:

public void someMethod() { 

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

    switch (enumExample) { 
    case VALUE_A: 
     break; 
    } 

} 

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

2

这应该这样做:

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

这是我如何使用它。如下图所示

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