我怎么摆脱这些关于枚举的警告?

时间:2012-09-12 04:27:56

标签: java generics enums warnings

我想摆脱关于未经检查的转换和参数化的这些警告而不会压制它们。

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) {}
    }
}

2 个答案:

答案 0 :(得分: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) {
    }
} 
}

答案 1 :(得分:0)

你不能不写自己的valueOfEnum定义为:

class Enum<E extends Enum<E>>

Enum.valueOf定义为:

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

请注意递归类型参数化,这意味着您只能使用特定枚举类(例如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()); } } 方法来接受任何枚举类。

{{1}}