将枚举作为Object类型返回

时间:2014-02-25 06:20:28

标签: java reflection enums

我试图通过解析xml文档以编程方式设置Field的值来查找值。

我的结构有点像这样:

value = parseXml();
field.set(myObject, value);

private Object parseXml()
{
   String value = getValueFromXmlNode();
   if (type.isInstance(Enum.class))
   {
     return Enum.valueOf(((Class<Enum>) type), value);
   }
   else
   {
     return value;
   }
}

这适用于大多数情况。但是,如果字段需要Enum,则不再有效。因为我将我的方法的返回类型设置为Object,所以enum会被转换为String。然后field.set()调用失败。

让方法返回可能是Enum的泛型类型的正确方法是什么?

对于原始类型,有autobox和unbox的Object包装器,Enum有类似的东西吗?

2 个答案:

答案 0 :(得分:3)

  

因为我将我的方法的返回类型设置为Object,所以enum会被转换为String。

不,不。

  

对于原始类型,有autobox和unbox的Object包装器,Enum有类似的东西吗?

枚举值对象。您已经可以将枚举值放在对象变量中。

我认为问题在于这一行:

if (type.isInstance(Enum.class))

应该是:

if (type.isEnum())

isInstance调用无法执行您想要的操作,因为它询问类对象Enum.class是否为instanceof type类。

然后,因为if检查不起作用,它总是选择按原样返回String value的第二个分支,这就是为什么看起来enum本身被强制转换为字符串。

答案 1 :(得分:-1)

为什么使用Enum.valueOf(Class, String)代替Enum.valueOf(String)?您知道定义Enum的String的值。

尝试改为使用Enum.valueOf(value)

从Enum.valueOf(Class,String)的javadoc:“注意,对于特定的枚举类型T,可以使用该枚举上隐式声明的公共静态T valueOf(String)方法来代替此方法来映射相应枚举常量的名称。“