2012-07-11 13 views
16

私は、パラメータとして列挙型を渡す必要があるメソッドを持っています。メソッドパラメータを任意の列挙型として宣言する方法

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

私はいくつか列挙型を持っていると方法は、任意の列挙型で動作するはず一般的なものです。どのような一般的な列挙型を受け入れるためにこのメソッドの署名を書く正しい方法は何ですか?私はこの目的のためにマーカーインターフェイスを使用できることを知っていますが、一般的なenumシグネチャで記述したいと思います。これについて私に助言してください。

これは悪い考え方です:(それは動作しますが、私はIDEから生のタイプであると警告していますが、理由は不明です)。

あなたが行うことができ
public void doSomething(Enum operation); 

答えて

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

EDIT:あなたの変更に応じ例:

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) { 
+0

に何も追加することはできません。この動作例のEnumSetも参照してください。http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumSet.html – Zarkonnen

+0

こんにちは、返信ありがとうございますが、署名の問題について再度苦情を言います。私は、私が探している正確な署名を投稿したはずだと申し訳なく思っています。私があなたが言及したものを追加する必要がある既存のメソッドの署名について私の編集を見てください。この場合、メソッドの署名はどのように見えるでしょうか? – popcoder

+1

これはあなたが探しているものですか?またはTと列挙型は別の型にする必要がありますか? –

10

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

それが列挙型ではなく、任意の特定のものにする必要があると言います。

+0

明確にするには:これは基本的に警告を取り除きます( 'Enum'と' Enum 'は同じものですが、明示的です)。 –

+1

@BrendanLong: 'Enum'と' Enum 'は同じものではありません。例えばあなたは 'List'に物を追加することができますが、' List ' – newacct

0

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

関連する問題