Ich versuche einen Weg zu finden, um die Werte einer Aufzählung zu durchlaufen, während Generika verwendet werden. Ich bin mir nicht sicher, wie ich das machen soll oder ob es möglich ist.
Der folgende Code zeigt, was ich tun möchte. Beachten Sie, dass der Code T.values () im folgenden Code nicht gültig ist.
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);
}
}
}
So würde ich ein Filterobjekt instanziieren:
Filter<TimePeriod> filter = new Filter<TimePeriod>(TimePeriod.ALL);
Die Aufzählung ist wie folgt definiert:
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;
}
}
Mir ist klar, dass es möglicherweise nicht sinnvoll ist, die Werte einer Aufzählung in eine Liste zu kopieren, aber ich verwende eine Bibliothek, die eine Liste von Werten als Eingabe benötigt und nicht mit Aufzählungen funktioniert.
BEARBEITEN 05.02.2010:
Die meisten der vorgeschlagenen Antworten sind sehr ähnlich und schlagen Folgendes vor:
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);
}
}
}
Dies würde gut funktionieren, wenn ich sicher sein kann, dass selectedOption einen Wert ungleich Null hat. Leider ist dieser Wert in meinem Anwendungsfall oft null, da es auch einen öffentlichen Filter () no-arg-Konstruktor gibt. Dies bedeutet, dass ich eine selectedOption.getClass () nicht ausführen kann, ohne eine NPE zu erhalten. Diese Filterklasse verwaltet eine Liste der verfügbaren Optionen, welche der Optionen ausgewählt ist. Wenn nichts ausgewählt ist, ist selectedOption null.
Das einzige, was ich denken kann, um dies zu lösen, ist, tatsächlich eine Klasse im Konstruktor zu übergeben. Also so etwas wie das:
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);
}
}
}
Haben Sie Ideen, wie Sie dies tun können, ohne einen zusätzlichen Klassenparameter in den Konstruktoren zu benötigen?
getClass
Code schlägt auch fehl, wenn die Enum-Konstante eine anonyme Unterklasse ist ( Beispiel ).getDeclaringClass
sollte stattdessen verwendet werden.