【问题标题】:How to cast a String value to an Enum value by Class? [duplicate]如何按类将字符串值转换为枚举值? [复制]
【发布时间】:2015-06-29 18:24:32
【问题描述】:

我有以下课程:

public class EnumContainer{

    private Class<?> enumClass;
    //GET, SET

    public EnumContainer(Class<?> clazz){
        this.enumClass = clazz;
    }

    public boolean tryCast(String value){
        //Here I should try to cast the String to the Enum by enumClass field

        //return true if cast was successfull
        //false otherwise
    }
}

在 Java 中甚至可以执行这种转换吗?

【问题讨论】:

  • 是的;这是.valueOf()
  • @VinceEmigh 因为我使用的是休眠,为了简化一些映射,我需要使用 @Type 注释,它指的是必须包含 Class> 字段的类型。从网页我只能获取一个字符串值。
  • @fge 你不能提供一个完整的答案吗?
  • @fge 我应该对什么对象执行method.invoke(obj, args) 调用?
  • 这不是强制转换。别再说投射了。

标签: java reflection enums


【解决方案1】:

这实际上有点痛苦,因为Enum 的声明方式。您将无法使用Class&lt;?&gt;(例如Class&lt;? extends Enum&lt;?&gt;&gt;)调用valueOf。没有未经检查的强制转换的唯一方法是通过getEnumConstants

public boolean tryCast(String value){
    for(Object o : enumClass.getEnumConstants()) {
        Enum<?> e = (Enum<?>) o;
        if(e.name().equals(value))
            return true;
    }
    return false;
}

如果您不关心未经检查的演员表,您可以这样做:

try {
    Enum.valueOf( (Class) enumClass, value );
    return true;
} catch(IllegalArgumentException e) {
    return false;
}

但是,你知道,有些人会抱怨,因为它是原始类型。 getEnumConstants 可能会更好,因为从那时起你就不会对这种事情使用异常。


此外,由于您有一个Class&lt;?&gt;,您可能需要执行类似的检查

if( !Enum.class.isAssignableFrom(enumClass) )
    return false;

或者在构造函数中抛出异常。

【讨论】:

  • 好吧,未经检查的强制转换总是不是一个好主意......而且由于我不知道它在内部是如何工作的,我宁愿不使用你最后的方法。
  • @user3663882 然后不要。我是抱怨的人之一,所以如果你不抱怨我也没关系。 ; )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2018-02-14
  • 2017-10-13
相关资源
最近更新 更多