2012-04-15 37 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; 
     } 
    } 
}