Java:Enums的通用方法

时间:2013-05-06 20:00:17

标签: java generics enums

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

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 个答案:

答案 0 :(得分:54)

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. 未使用type参数。
  3. 它返回输入而不是实例名称。也许返回实例会更有用 - Enum.valueOf(String)的一个不区分大小写的版本。
  4. 它在实例上调用静态方法,因此您可以迭代。 EnumSet会为你做所有反光的事情。