Подтвердить что ты не робот

Java: общий метод для перечислений

Помогите мне разобраться с дженериками. Скажем, у меня есть две перечисления как внутренние классы:

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

Спасибо за вашу помощь. Для -Alex-

4b9b3361

Ответ 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;
}

В оригинале есть несколько проблем:

  • Он принимает экземпляр enum вместо класса, представляющего перечисление который ваш вопрос предполагает, что вы хотите использовать.
  • Параметр type не используется.
  • Он возвращает вход вместо имени экземпляра. Возможно, возвращение экземпляра было бы более полезным - без учета регистра версии Enum.valueOf(String).
  • Он вызывает статический метод для экземпляра, чтобы вы могли выполнять итерацию. EnumSet делает все отражающее вещество для вас.