Java:枚举的通用方法

2022-09-01 12:42:46

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

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;
}

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

基本上我想这样做:

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

答案 1
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;
}

原版有几个问题:

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

答案 2