次の質問に対応します。
列挙型を一般的に要求するようにコードをフォーマットするにはどうすればよいですか?.
Foo.Java
public enum Foo {
a(1), b(2);
}
Bar.Java
public class Bar {
public Bar(generic enum);
}
後で「foo」などの列挙型クラスを追加しますが、任意の種類の列挙型クラスを含むbarを作成できます。ちなみに私は「jdk1.6.0_20」を持っています...
参考のために 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;
}
}
from
、with
などのファクトリメソッドを追加することもできます。
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);
参考:
次のようにすることもできます:
public class Bar {
public Bar(Enum<?> e){}
}
すべての列挙はEnumを拡張します。列挙定数が必要な場合は、これを使用できます。
e.getDeclaringClass().getEnumConstants()
public class bar {
public <E extends Enum<E>> void bar(E enumObject);
}
bar
メソッドは、あらゆる種類の列挙型を受け取ることができるようになりました。