ジェネリックスを使用しながら列挙型の値を反復処理する方法を見つけようとしています。これを行う方法、またはそれが可能かどうかわからない。
次のコードは、私がやりたいことを示しています。次のコードでは、コードT.values()が無効であることに注意してください。
public class Filter<T> {
private List<T> availableOptions = new ArrayList<T>();
private T selectedOption;
public Filter(T selectedOption) {
this.selectedOption = selectedOption;
for (T option : T.values()) { // INVALID CODE
availableOptions.add(option);
}
}
}
Filterオブジェクトをインスタンス化する方法は次のとおりです。
Filter<TimePeriod> filter = new Filter<TimePeriod>(TimePeriod.ALL);
列挙型は次のように定義されます。
public enum TimePeriod {
ALL("All"),
FUTURE("Future"),
NEXT7DAYS("Next 7 Days"),
NEXT14DAYS("Next 14 Days"),
NEXT30DAYS("Next 30 Days"),
PAST("Past"),
LAST7DAYS("Last 7 Days"),
LAST14DAYS("Last 14 Days"),
LAST30DAYS("Last 30 Days");
private final String name;
private TimePeriod(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
列挙型の値をリストにコピーするのは意味がないかもしれませんが、入力として値のリストを必要とし、列挙型では機能しないライブラリを使用しています。
2010年2月5日編集:
提案された回答のほとんどは非常に類似しており、次のようなことを提案しています。
class Filter<T extends Enum<T>> {
private List<T> availableOptions = new ArrayList<T>();
private T selectedOption;
public Filter(T selectedOption) {
Class<T> clazz = (Class<T>) selectedOption.getClass();
for (T option : clazz.getEnumConstants()) {
availableOptions.add(option);
}
}
}
selectedOptionにnull以外の値があることを確認できれば、これはうまく機能します。残念ながら、私のユースケースでは、パブリックFilter() no-argコンストラクターもあるため、この値はnullになることがよくあります。これは、NPEを取得せずにselectedOption.getClass()を実行できないことを意味します。このフィルタークラスは、どのオプションが選択されているかを利用可能なオプションのリストを管理します。何も選択されていない場合、selectedOptionはnullです。
これを解決するために私が考えることができる唯一のことは、コンストラクターで実際にクラスを渡すことです。だからこのようなもの:
class Filter<T extends Enum<T>> {
private List<T> availableOptions = new ArrayList<T>();
private T selectedOption;
public Filter(Class<T> clazz) {
this(clazz,null);
}
public Filter(Class<T> clazz, T selectedOption) {
this.selectedOption = selectedOption;
for (T option : clazz.getEnumConstants()) {
availableOptions.add(option);
}
}
}
コンストラクターで追加のClassパラメーターを必要とせずにこれを行う方法はありますか?
getClass
enum定数が匿名サブクラス(ある場合にコードも失敗する一例)。getDeclaringClass
代わりに使用する必要があります。