Java:Enums的通用方法

Ale*_*lls 23 java generics enums

帮我理解泛型.假设我有两个枚举作为内部类,如下所示:

public class FoodConstants {
    public static enum Vegetable {
        POTATO,BROCCOLI,SQUASH,CARROT;
    }

    public static enum Fruit {
        APPLE,MANGO,BANANA,GUAVA;
    }
}
Run Code Online (Sandbox Code Playgroud)

不是让两个枚举实现接口,而是必须两次实现相同的方法,我希望在外部类中有一个方法,它可以执行以下操作:

public <e> String getEnumString<Enum<?> e, String s) {
    for(Enum en: e.values()) {
        if(en.name().equalsIgnoreCase(s)) {
            return s;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

但是这种方法不能编译.我想要做的是找出一个字符串值是否是枚举值的名称,在任何枚举中,是否是蔬菜,水果,什么不是.无论这实际上是否是一种冗余方法,我试图(重新)编写的那个有什么问题?

基本上我想这样做:

public class FoodConstants {
    public static enum Vegetable {
        POTATO,BROCCOLI,SQUASH,CARROT;
    }

    public static enum Fruit {
        APPLE,MANGO,BANANA,GUAVA;
    }

    public <e> String getEnumString<Enum<?> e, String s) {
        for(Enum en: e.values()) {
            if(en.name().equalsIgnoreCase(s)) {
                return s;
            }
        }
        return null;
    }
} //end of code
Run Code Online (Sandbox Code Playgroud)

Mik*_*uel 56

public static <E extends Enum<E>>
String getEnumString(Class<E> clazz, String s){
  for(E en : EnumSet.allOf(clazz)){
    if(en.name().equalsIgnoreCase(s)){
      return en.name();
    }
  }
  return null;
}
Run Code Online (Sandbox Code Playgroud)

原版有一些问题:

  1. 它接受枚举的实例,而不是代表你的问题建议你想要使用的枚举的类.
  2. 未使用type参数.
  3. 它返回输入而不是实例名称.也许返回实例会更有用 - 一个不区分大小写的版本Enum.valueOf(String).
  4. 它在实例上调用静态方法,因此您可以迭代. EnumSet为你做所有反光的东西.

  • @SebastianRedl:实际上,`EnumSet.allOf()`比`.getEnumConstants()`更有效,因为`.getEnumConstants()`必须复制内部常量数组(因为它返回一个数组,并且有无法防止数组被修改),而`EnumSet`可以使用内部实现细节直接迭代内部数组. (8认同)
  • 哦,clazz.getEnumConstants()可以代替EnumSet.allOf(clazz).考虑到EnumSet.allOf可能是根据它实现的,它可能稍微更有效,但是,然后,也许不是. (6认同)