0

未チェックの変換とパラメーター化に関するこれらの警告を抑制せずに取り除きたいです。

interface Switch {
    void toggle();
}
enum A implements Switch {
    a1,a2;
    @Override public void toggle() {
        state=!state;
    }
    boolean state;
}
enum B implements Switch {
    b1,b2;
    @Override public void toggle() {
        state=!state;
    }
    boolean state;
}
public class Warnings {
    public static void main(String[] args) {
        Class<? extends Enum>[] enums=new Class[]{A.class,B.class};
        for(Class<? extends Enum> clazz:enums)
            try {
                Enum s=Enum.valueOf(clazz,args[0]);
                ((Switch)s).toggle();
            } catch(IllegalArgumentException eee) {}
    }
}
4

2 に答える 2

0

独自の を書かないとできませんvalueOfEnumと定義されている:

class Enum<E extends Enum<E>>

次のようにEnum.valueOf定義されます。

public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                            String name) 

2 つの疑問符が同じ (不明) を表すと想定されていないため、 a は一致しないためvalueOf、特定の列挙型クラス (例: A.class) でのみ呼び出すことができ、一般的なものでは呼び出すことができないことを意味する再帰的な型パラメーター化に注意してください。Class<? extends Enum<?>>コンパイラによってタイプされます。

valueOfしたがって、配列の代わりにジェネリック コレクションを使用する以外に、列挙型クラスを受け入れる独自のメソッドを作成する必要があります。

public class Warnings {
    public static void main(final String[] args) {
        List<Class<? extends Enum<?>>> enums = new ArrayList<Class<? extends Enum<?>>>();
        enums.add(A.class);
        enums.add(B.class);
        for (Class<? extends Enum<?>> clazz : enums) {
            try {
                Switch s = valueOf(clazz, args[0]);
                s.toggle();
            } catch (IllegalArgumentException eee) {
            }
        }
    }

    private static Switch valueOf(final Class<? extends Enum<?>> enumClass, final String name) {
        Enum<?>[] enumConstants = enumClass.getEnumConstants();
        for (Enum<?> constant : enumConstants) {
            if (constant.name().equals(name)) {
                return (Switch) constant;
            }
        }
        throw new IllegalArgumentException(name + " is not a constant of enum class " + enumClass.getName());
    }
}
于 2012-09-14T02:54:09.853 に答える
0

配列とジェネリックを混在させないでください。Java のジェネリックは型消去を使用して実装されているため、これらはうまく連携しません。

これはうまくいくはずです。

interface Switch {
void toggle();
}

enum A implements Switch {

a1, a2;
@Override
public void toggle() {
    state = !state;
}

boolean state;
}
enum B implements Switch {

b1, b2;
@Override
public void toggle() {
    state = !state;
}

boolean state;
}

public class Test {

public static void main(String[] args) {
    List<Class<? extends Switch>> enums = new ArrayList<Class<? extends Switch>>();
    enums.add(A.class);
    enums.add(B.class);

    for (Class<? extends Switch> clazz : enums)
        try {
            Switch s = clazz.getEnumConstants()[0];
            ((Switch) s).toggle();
        } catch (IllegalArgumentException eee) {
    }
} 
}
于 2012-09-12T08:01:46.153 に答える