8

次のような基本的な列挙型があると仮定します。

public enum Color { Red, Green, Blue}

「列挙型クラス」のみを受け入れるジェネリック クラスを作成して、そのジェネリック クラスの具体的なインスタンス化を次のようにするにはどうすればよいMyClass<Color>でしょうか。

編集:

実際にやりたいことは、すべての列挙型「エントリ」をリストとして返す関数を含む汎用抽象クラスを作成することです。

public abstract class EnumListBean<E extends Enum<E>> {

    public List<E> getEnumList() {
        return Arrays.asList(E.values());
    }

}

ありながらDay.values()ご利用いただけE.values()ません。ここで何が間違っていますか?

4

5 に答える 5

7
public class EnumAcceptor<E extends Enum<E>> {
    ...
}

クラス内の型として E を使用します。

于 2012-07-15T11:51:36.053 に答える
4

元の質問に対する回答については、Istvan Devai を参照してください。

フォローアップのために、次のようvalues()なメソッドは静的メソッドであるため、ジェネリックパラメーターからそれを取得しようとしてもうまくいきません。Class不十分な解決策として、列挙型のオブジェクトをコンストラクターに渡すことができます。と使用しますClass.getEnumConstants。ただしMyEnum.values()、クラスではなくコンストラクターに渡すこともできます。そのため、リフレクションを完全に回避してください。賢明な列挙メタクラスがないのは本当に残念です。

于 2012-07-15T12:53:20.183 に答える
1

Anenumは、 から派生したクラスを実際に宣言しEnumます。そのため、次を使用できます。

public class MyClass<T extends Enum> { }
于 2012-07-15T11:50:19.687 に答える
1

@Istvanのソリューションは、の要素のみを受け入れることができることに注意してください。それenumが必要な場合は問題ありません。

自体をパラメーターとして渡すことはできませんがenum(実際には同等のオブジェクトがないため) 、コンストラクターclassで の を受け取り、そこから の詳細enumを導出する必要があることを指定できます。enum

public class EnumAcceptor<E extends Enum<E>> {
  public EnumAcceptor(Class<E> c) {
    // Can get at the enum constants through the class.
    E[] es = c.getEnumConstants();
  }

  enum ABC {
    A, B, C;
  }

  public static void main(String args[]) {
    EnumAcceptor<ABC> abcAcceptor = new EnumAcceptor<ABC>(ABC.class);
  }
}
于 2012-11-30T14:45:38.780 に答える
0

E.values()型消去のために使用できません-型Eは実行時に使用できません。

あなたの質問の特定のケースについては、Guavaを使用したほうがよいでしょうLists.newArrayList

List<Color> days = Lists.newArrayList(Color.values());
于 2012-11-30T14:58:49.117 に答える