当枚举类型引用是类时,如何将字符串转换为枚举值<?>?



我有代码使用其setter方法在对象上设置值。其中一个资源库将枚举类型作为方法参数。 代码如下所示:

    String value = "EnumValue1";
    Method setter = getBeanWriteMethod("setMyEnumValue");
    Class<?> type = setter.getParameterTypes()[0];
    Object convertedValue = null;
    if (type.isEnum()) {
       convertedValue = convertToEnum(value, type);
    } else {
       convertedValue = ClassUtils.convertType(value, type);
    }
    return convertedValue;

问题是在convertToEnum方法中放什么。我知道我可以通过迭代type对象的枚举常量(或字段(来"暴力破解它",并与值匹配。我是否忽略了使用反射的更简单方法? (我看了几个例子,但没有找到任何枚举只能通过类知道的地方(。

在我的头顶上:

  Enum<?> convertedValue = Enum.valueOf((Class<Enum>)type,  value);

这会将字符串转换为类型为 Enum 类的枚举常量

编辑:现在我手边有一台电脑,我可以看到实际工作。 以下任一情况都可以正常运行,没有编译器警告:

Enum<?> convertedValueA = Enum.valueOf(type, value);
Enum<?> convertedValueB = Enum.valueOf(type.asSubclass(Enum.class), value);

第二个调用asSubClass((,它将执行运行时检查以确保type是某个枚举类,但valueOf()方法无论如何都必须进行该检查才能正常工作。

下面给了我一个编译错误:

Enum<?> convertedValueC = Enum.valueOf((Class<? extends Enum <?>>)type, value);
java: Foo.java:22: <T>valueOf(java.lang.Class<T>,java.lang.String) in java.lang.Enum cannot be applied to (java.lang.Class<capture#134 of ? extends java.lang.Enum<?>>,java.lang.String)

转换为通配符类型的复杂性让我感到困惑,所以我可能尝试了错误的转换。此外,它没有运行时效果的事实意味着很容易出错并且永远不会发现。

您可以使用

Class enumType = ....
String name = ....
Enum e = Enum.valueOf(enumType, name);

例如

import java.lang.annotation.*;
public class Main {
    public static void main(String[] args) {
        Class enumType = RetentionPolicy.class;
        String name = "SOURCE";
        Enum e = Enum.valueOf(enumType, name);
        System.out.println(e);
    }
}

指纹

SOURCE
Enum.valueOf(yrEnum, myString)

返回枚举,其中 myString 是所需枚举实例的名称。yrEnum.values()返回一个包含所有不同可能的枚举实例的数组。

相关内容

  • 没有找到相关文章

最新更新