いいえ、amalloyが指摘したように、Javaでは列挙型を型パラメーターで宣言することはできません。列挙型がどのように使用されるかを考えると、たとえば、である理由が明らかになりますswitch
。
また、言語がジェネリック列挙型をどのように実装するかを検討してください。これは簡単なことではありません。ジェネリック列挙型の場合MyEnum<T>
、各列挙型定数はT
特定のタイプに解決する必要があります。そうしないと、定数にはなりません。このことを考慮:
enum MyEnum<T> {
FOO; // T is not resolved
}
ここは何T
ですか?FOO
言語は、それを表現できるようにするためだけに新しい構文を必要とします。次に例を示します。
enum MyEnum<T> {
FOO<String>;
}
そのため、過度に説得力のあるユースケースを持たないセマンティクスをサポートするために、言語の複雑さが増しています。言語設計者が列挙型の型パラメーターを単純に修正した理由は簡単に理解できます。
回避策:
列挙型を使用しないだけで、目的のパターンをエミュレートできます。インターフェイスの実装をユーティリティクラスに整理します。
public class MyImplementations {
public static final MyInterface<Integer> FOO =
new MyInterface<Integer>() {
...
};
public static final MyInterface<String> BAR =
new MyInterface<String>() {
...
};
public static final MyInterface<List<MyOtherType>> BAZ =
new MyInterface<List<MyOtherType>>() {
...
};
private MyImplementations() { }
}
本質的に欠落している唯一のことは、さまざまな実装を反復する方法です。これは、で行うことができたようにですがMyEnum.values()
、仮想的MyEnum<T>
には、反復できる最も具体的なタイプはですMyEnum<?>
。