web-dev-qa-db-ja.com

Java:メソッドパラメータのジェネリック列挙型

次の質問に対応します。

Java:メソッドのEnumパラメータ

列挙型を一般的に要求するようにコードをフォーマットするにはどうすればよいですか?.

Foo.Java

public enum Foo { 
    a(1), b(2);
}

Bar.Java

public class Bar {
    public Bar(generic enum);
}

後で「foo」などの列挙型クラスを追加しますが、任意の種類の列挙型クラスを含むbarを作成できます。ちなみに私は「jdk1.6.0_20」を持っています...

28
Ed Michel

参考のために EnumSet のメソッドを参照してください。

public static <E extends Enum<E>> EnumSet<E> of(E e)

(このメソッドは、指定されたEnum要素eから1つの要素を持つEnumSetを返します)

したがって、必要な一般的な境界は次のとおりです:<E extends Enum<E>>


実際には、おそらくBar自体をジェネリックにします。

public class Bar<E extends Enum<E>> {

    private final E item;

    public E getItem(){
        return item;
    }

    public Bar(final E item){
        this.item = item;
    }
}

fromwithなどのファクトリメソッドを追加することもできます。

public static <E2 extends Enum<E2>> Bar<E2> with(E2 item){
    return new Bar<E2>(item);
}

このように、クライアントコードでは、ジェネリックシグネチャを1回記述するだけで済みます。

// e.g. this simple version
Bar<MyEnum> bar = Bar.with(MyEnum.SOME_INSTANCE);
// instead of the more verbose version:
Bar<MyEnum> bar = new Bar<MyEnum>(MyEnum.SOME_INSTANCE);

参考:

37

次のようにすることもできます:

public class Bar {
    public Bar(Enum<?> e){}
}

すべての列挙はEnumを拡張します。列挙定数が必要な場合は、これを使用できます。

e.getDeclaringClass().getEnumConstants()
14
André
public class bar {
    public <E extends Enum<E>> void bar(E enumObject);
}

barメソッドは、あらゆる種類の列挙型を受け取ることができるようになりました。

8
gustafc