350

最初に、私はC#の列挙型に非常に精通しており、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;
            }
        }
    }
}
4

7 に答える 7

717

これに変更します:

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

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

于 2012-04-15T11:05:13.293 に答える
40

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
}
于 2012-04-15T11:03:53.283 に答える
40

間違い:

case AnotherClass.MyEnum.VALUE_A

右:

case VALUE_A:
于 2019-03-07T22:15:41.997 に答える
6

これは行う必要があります:

//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;
            }
        }
    }
}
于 2012-04-15T11:09:04.313 に答える
2

これが私が使っている方法です。そしてそれは素晴らしく働いています-

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;
        }
    }
}
于 2017-03-30T09:30:12.593 に答える
2

Java 14以降では、switch式を使用できます。

この投稿のために

public enum MyEnum {
    VALUE_A, VALUE_B;
}
public void someMethod() { 
    MyEnum enumExample //...

    switch (enumExample) {
        case VALUE_A -> {
            // logic
        }
        case VALUE_B -> {
            // logic
        }   
    }
}

式を切り替える

すべての式と同様に、switch式は単一の値に評価され、ステートメントで使用できます。フォールスルーを防ぐためにbreakステートメントの必要性を排除する「caseL->」ラベルが含まれている場合があります。yieldステートメントを使用して、スイッチ式の値を指定できます。

public enum Month {
    JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC;
}

例1:値を返します。

public static int getNoOfDaysInAMonth(Month month, boolean isLeapYear) {
    return switch(month) {
        case APR, JUN, SEP, NOV -> 30;
        case FEB -> (isLeapYear)? 29: 28;
        case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31;
    };
}

例2:値を返しません。

public static void printNoOfDaysInAMonth(Month month, boolean isLeapYear) {
    switch(month) {
        case APR, JUN, SEP, NOV -> {
            System.out.println("30 days");
        }
        case FEB -> {
            System.out.println(((isLeapYear)? 29: 28) + " days");
        }
        case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> {
            System.out.println("31 days");
        }
    };
}

参照

式の切り替え

于 2021-03-25T08:59:35.987 に答える
0

someMethod()このように書いてください:

public void someMethod() {

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

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

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

于 2012-04-15T11:07:58.270 に答える