写入/返回任何枚举的枚举常量的方法BY CLASS

时间:2018-04-09 13:34:34

标签: java generics enums

我让仿制品再次混淆了......

this question的帮助下,我编写了存储和检索枚举值的方法,而不是绑定到特定的枚举类:

public static void storeEnum(Enum<?> enumValue) {
    // Store it somehow
}

public static <E extends Enum<E>> E getEnum(E defaultValue) {
    String valueString = // get it somehow
    try {
        return (E) Enum.valueOf(defaultValue.getDeclaringClass(), valueString);
    } catch (Exception e) {
        return defaultValue;
    }
}

但现在我不想再有任何默认值了,我希望null以防万一!

首次尝试:

public static <E extends Enum<E>> E getEnum(Class<? extends Enum> enumClass) {
    String valueString = // get it somehow
    try {
        return (E) Enum.valueOf(enumClass, valueString);
    } catch (Exception e) {
        return null;
    }
}

这会编译,但是当我想要存储MyCoolEnum时,行MyCoolEnum mci = getEnum(MyCoolEnum.class);会中断(Maven)编译运行:incompatible types: inference variable E has incompatible upper bounds java.lang.Enum<E>,MyCoolEnum

当然,这来自?。但是如何从班级中推断出类型呢?

  • (Class<E extends Enum> enumClass)无效。
  • (Class<Enum<E>> enumClass)打破valueOfThe inferred type Enum<E> is not a valid substitute for the bounded parameter <T extends Enum<T>>)。

1 个答案:

答案 0 :(得分:3)

我无法重现您的第一个错误,但作为替代方案,您应该能够使用Class<E>,即:

public static <E extends Enum<E>> E getEnum(Class<E> enumClass) {
    String valueString = // get it somehow
    try {
        return Enum.valueOf(enumClass, valueString);
    } catch (Exception e) {
        return null;
    }
}

(注意你也可以放弃演员表)