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-
Ответы
Ответ 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
делает все отражающее вещество для вас.