Enum.valueOf(Class<T> enumType, String name) 问题

2022-09-01 05:54:48

我正在尝试解决与动态枚举查找相关的编译错误(“绑定不匹配:...”)。

基本上,我想实现这样的东西:

String enumName = whatever.getEnumName();
Class<? extends Enum<?>> enumClass = whatever.getEnumClass();
Enum<?> enumValue = Enum.valueOf(enumClass, enumName);

无论我做什么,我总是以编译错误告终。老实说,泛型和枚举对我来说非常令人难以置信......

我在这里做错了什么?


答案 1

我认为它不会完全像这样工作,除非你有权访问类型变量(通过类型或方法签名)。问题是以下方法签名:Enum.valueOf

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

没有类型变量就无法获得 T。但是,如果您愿意禁止某些编译器警告,则可以这样做:

public enum King{
    ELVIS
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(final String[] args){
    final Class<? extends Enum> enumType = King.class;
    final Enum<?> theOneAndOnly = Enum.valueOf(enumType, "ELVIS");
    System.out.println(theOneAndOnly.name());
}

输出:

猫 王


答案 2

问题出在 。我们想要,但我们不能得到它,因为我们有两个不同的通配符。Class<? extends Enum<?>>E extends Enum<E>

因此,我们需要引入一个泛型参数,可能通过调用一个方法引入:

enum MyEnum {
    ME;
}

public class EnName {
    public static void main(String[] args) {
        Enum<?> value = of(MyEnum.class, "ME");
        System.err.println(value);
    }
    private static <E extends Enum<E>> E of(Class<E> clazz, String name) {
        E value = Enum.valueOf(clazz, name);
        return value;
    }
}

但是反射是肮脏的,很少是你想要的。别这样。