Java 当枚举类型引用是类时,如何将字符串转换为枚举值<>;?
我有一个使用setter方法在对象上设置值的代码。其中一个setter将枚举类型作为方法参数。代码如下所示:Java 当枚举类型引用是类时,如何将字符串转换为枚举值<>;?,java,reflection,enums,Java,Reflection,Enums,我有一个使用setter方法在对象上设置值的代码。其中一个setter将枚举类型作为方法参数。代码如下所示: String value = "EnumValue1"; Method setter = getBeanWriteMethod("setMyEnumValue"); Class<?> type = setter.getParameterTypes()[0]; Object convertedValue = null; if (type.
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;
String value=“EnumValue1”;
方法setter=getBeanWriteMethod(“setMyEnumValue”);
类类型=setter.getParameterTypes()[0];
Object convertedValue=null;
if(type.isEnum()){
convertedValue=convertToEnum(值,类型);
}否则{
convertedValue=ClassUtils.convertType(值,类型);
}
返回转换值;
问题是在convertToEnum
方法中放置什么。我知道我可以通过迭代类型
对象的枚举常量(或字段)并匹配值来“强制执行”。我是否忽略了使用反射的更简单方法?(我看了几个例子,但没有发现枚举只通过类知道的地方)
返回枚举,其中myString是所需枚举实例的名称。
和
yrEnum.values()
Enum<?> convertedValue = Enum.valueOf((Class<Enum>)type, value);
转换为通配符类型的复杂性让我困惑,所以我可能尝试了错误的转换。另外,它没有运行时效果这一事实意味着它很容易出错,而且永远不会被发现。您可以使用
Class enumType = ....
String name = ....
Enum e = Enum.valueOf(enumType, name);
e、 g
印刷品
SOURCE
和之前一样,这项工作需要演员阵容。谢谢,我第一次尝试时一定是演员阵容搞错了。这是正确的解决方案。不幸的是,在尝试此操作之后,我发现需要进行不区分大小写的匹配,而Enum.valueOf()
则不行。那么回到暴力手段…这个案子很糟糕type
不是Enum.class
。在任何情况下,asSubclass
都比hack cast好。@TomHawtin-tackline:使用asasSubclass
会给我编译器警告<代码>Class convertedValue=Enum.valueOf(enumClass,“Value1”)原始类型和未检查调用的代码>。因此,我不确定这是不是更好。问题是,如果类型
变量被声明为类
,则必须强制转换它,否则它将无法编译。如果它被声明为类
(无通配符),则它可以在不强制转换的情况下工作。我搞砸了,因为Method.getParameterTypes()
的返回类型是Class[]
,这使得我需要强制转换代码>提供了“绑定不匹配:Enum类型的泛型方法valueOf(Class,String)不适用于参数(Class,String)。推断的类型capture#2-of?不是绑定参数的有效替代品”。另一个给了我一个警告:“类型安全:Enum类型的泛型方法valueOf(Class,String)的未选中调用valueOf(Class,String)”——因为“asSubClass”返回一个Class@SamGoldberg那是一种原始类型。所以我认为它会起作用。很糟糕。@TomHawtin-tackline:没有演员阵容,我无法编译它。@SamGoldberg看我的例子。不需要演员阵容。是的,我明白了。如果我在一个类和一个类之间切换,那么它可以正常工作并且编译得很好。@SamGoldberg和代码更简单,但是做的是相同的事情。
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