web-dev-qa-db-ja.com

Java:サブクラスの下の列挙型でswitchステートメントを使用する

最初に、C#の列挙型に精通していることを述べます。Javaの列挙型はかなり混乱しているようです。

ご覧のとおり、次の例ではswitch文@ enumsを使用しようとしていますが、何をしていても常にエラーが発生します。

私が受け取るエラーは:

修飾されたケースラベルSomeClass.AnotherClass.MyEnum.VALUE_Aは、修飾されていない列挙定数VALUE_Aに置き換える必要があります

問題は、Iquiteがエラーを理解することですが、enumは別のサブクラスにあるため、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;
            }
        }
    }
}
219
Popokoko

これに変更します:

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

手がかりはエラーにあります。 caseラベルを列挙型で修飾する必要はなく、その値だけを修飾します。

481
darrengorman

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
}
30
Kru

これはすべきです:

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

これは私がそれを使用している方法です。そして、それは素晴らしく機能しています-

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;
        }
    }
}
1
Jimit Patel

違う:

case AnotherClass.MyEnum.VALUE_A

右:

case VALUE_A:
1
Akash Yellappa

この方法でsomeMethod()を記述します。

public void someMethod() {

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

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

Switchステートメントでは、定数名のみを使用する必要があります。

0
dash1e