31

列挙型をパラメーターとして渡す必要があるメソッドがあります。

public <T> T doSomething(SomeEnum operation, Class<T> something);

私はいくつかの列挙型を持っており、このメソッドはどの列挙型でも機能する一般的な方法です。ジェネリック列挙型を受け入れるためにこのメソッドシグネチャを書く正しい方法は何ですか?この目的でマーカーインターフェイスを使用できることは知っていますが、一般的な列挙型署名を使用して記述したいと思います。これについて教えてください。

以下の悪い考えは何ですか:(動作しますが、IDEからrawタイプであるという警告が表示されます。理由はわかりません)。

 public void doSomething(Enum operation);
4

3 に答える 3

40
public <E extends Enum<E>> void doSomething(E operation);

編集:あなたの修正による例:

public class Main {

    public enum Day {
        SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
        THURSDAY, FRIDAY, SATURDAY 
    }

    public <E extends Enum<E>> E doSomething(E operation, Class<E> klazz) {

        return operation;
    }

    public static void main(String[] args) {

        new Main().doSomething(Day.FRIDAY, Day.class);
    }

}

EDIT2:

Tと列挙型を別々のタイプとして必要とする場合は、次のものが必要になります。

public <T, E extends Enum<E>> T doSomething(E operation, Class<T> klazz) {
于 2012-07-11T14:38:56.677 に答える
13

あなたができること:

public void doSomething(final Enum<?> operation);

これは、列挙型である必要があると言っていますが、特定のものではありません。

于 2012-07-11T14:38:26.983 に答える
3

これはもっとクリアされています:

    public class EnumTest {

    protected static <E extends Enum<E>> void enumValues(Class<E> enumData) {
        for (Enum<E> enumVal: enumData.getEnumConstants()) {  
            System.out.println(enumVal.toString());
        }  
    }

    public static enum TestEnum {
        ONE, TWO, THREE;
    }

    public static void main(String param [] ) {
        EnumTest.enumValues(EnumTest.TestEnum.class);
    }
}
于 2017-05-22T14:55:27.940 に答える