web-dev-qa-db-ja.com

Java:Enumのジェネリックメソッド

ジェネリック医薬品について教えてください。たとえば、次のような内部クラスとして2つの列挙型があるとします。

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

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

両方の列挙型でインターフェイスを実装し、同じメソッドを2回実装する必要があるのではなく、外部クラスに次のようなメソッドを実装したいと思います。

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
23
Alexander Mills
_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はすべての反射的なことを行います。
56
Mike Samuel