Estoy tratando de encontrar una forma de iterar a través de los valores de una enumeración mientras uso genéricos. No estoy seguro de cómo hacer esto o si es posible.Iterar los valores de enum usando genéricos de Java
El siguiente código ilustra lo que quiero hacer. Tenga en cuenta que el código T.values () no es válido en el siguiente código.
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);
}
}
}
Aquí es cómo iba a crear una instancia de un objeto de filtro:
Filter<TimePeriod> filter = new Filter<TimePeriod>(TimePeriod.ALL);
La enumeración se define como sigue:
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;
}
}
me di cuenta de que podría no tener sentido para copiar los valores de una enumeración a una lista, pero estoy usando una biblioteca que necesita una lista de valores como entrada y no funcionará con enumeraciones.
EDITAR 2/5/2010:
La mayoría de las respuestas propuestas son muy similares y sugieren hacer algo como esto:
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);
}
}
}
Esto sería un gran trabajo si puedo estar seguro de que selectedOption tiene un valor no nulo. Desafortunadamente, en mi caso de uso, este valor es a menudo nulo, ya que hay un filtro público() constructor no-arg también. Esto significa que no puedo hacer una selectedOption.getClass() sin obtener un NPE. Esta clase de filtro administra una lista de opciones disponibles que de las opciones se selecciona. Cuando no se selecciona nada, selectedOption es nulo.
Lo único que puedo pensar para resolver esto es pasar realmente una clase en el constructor. Entonces algo como esto:
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);
}
}
}
¿Alguna idea de cómo hacer esto sin la necesidad de un parámetro de clase adicional en los constructores?
El código 'getClass' también fallará si la constante enum es una subclase anónima ([ejemplo] (https://ideone.com/ccjW7w)). ['getDeclaringClass'] (http://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html#getDeclaringClass--) debería usarse en su lugar. – Radiodef