【问题标题】:generic Enum.valueOf method : Enum class in parameter and return Enum item通用 Enum.valueOf 方法:参数中的枚举类并返回枚举项
【发布时间】:2014-10-14 09:25:09
【问题描述】:

我想创建一个在传入参数的任何 Enum 类上实现 valueOf 的方法(并且还包装一些专门的错误/缺失名称代码)。 所以基本上,我有几个枚举,例如:

enum Enum1{ A, B, C }
enum Enum2{ D, E, F }

我想要一个环绕valueOf 的方法。我找不到直接在参数中传递枚举类的方法,我可以在该参数上调用valueOf。这是我想出的:

private static Enum getEnum(Class<Enum> E, String name){
    for(Enum e: E.getEnumConstants())
        if(e.name().equals(name)){
            return e;
        }
    return null;
}

我想打电话给:getEnum(Enum1,"A")。但它不喜欢它:

java: cannot find symbol
  symbol:   variable Enum1
  location: class Main

【问题讨论】:

  • 难道没有一种方法-Enum.valueOf(Enum1.class, value);

标签: java enums


【解决方案1】:

既然可以使用 Java 自己的实现,为什么还要实现自己的实现?

 YourEnum yourEnum = Enum.valueOf(YourEnum.class, value);

http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#valueOf(java.lang.Class,%20java.lang.String)

然后你的方法变成:

private static <E extends Enum<E>> E getEnum(Class<E> enumClass, String name){
    try {
        return Enum.valueOf(enumClass, name);
    } catch(IllegalArgumentException e) {
        return null;
    }
}

你可以这样称呼它:

getEnum(Enum1.class, "A")

【讨论】:

  • 该方法似乎很有用,但我仍然遇到getEnum 签名的问题(我想将valueOf 调用包装到其中以添加更多代码。
  • 基于valueOf签名,public static &lt;T extends Enum&lt;T&gt;&gt; T valueOf(Class&lt;T&gt; enumType, String name),你需要private static &lt;E extends Enum&lt;E&gt;&gt; E getEnum(Class&lt;E&gt; clazz, String name)
【解决方案2】:

对于通过课程,您应该使用class

getEnum(Enum1.class,"A")

然后将方法签名更新为

private static Enum getEnum(Class<? extends Enum> E, String name){
    ...
}

【讨论】:

  • 它与getEnum 的签名不对应,后者采用class&lt;Enum&gt;。如果我将其更改为class&lt;?&gt;,那么E.getEnumConstants 将返回object...
  • 将方法签名更新为private static Enum getEnum(Class&lt;? extends Enum&gt; E, String name)
  • 好吧!然后我也可以使用@Zhuinden Enum.valueOf :-)
  • 我最终选择了准登答案,因为它返回了正确的枚举类型,而不仅仅是一个枚举。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多