使用Java泛型迭代枚举值
使用Java泛型迭代枚举值
我正在试图找到一种使用泛型来迭代枚举值的方法。不确定如何做或者是否可能实现这个功能。
下面的代码说明了我想要做的事情。请注意,代码T.values()在下面的代码中是无效的。
public class Filter{ private List availableOptions = new ArrayList (); private T selectedOption; public Filter(T selectedOption) { this.selectedOption = selectedOption; for (T option : T.values()) { // INVALID CODE availableOptions.add(option); } } }
这是我如何实例化一个Filter对象的方法:
Filterfilter = new Filter (TimePeriod.ALL);
该枚举定义如下:
public enum TimePeriod { ALL("全部"), FUTURE("未来"), NEXT7DAYS("接下来7天"), NEXT14DAYS("接下来14天"), NEXT30DAYS("接下来30天"), PAST("过去"), LAST7DAYS("过去7天"), LAST14DAYS("过去14天"), LAST30DAYS("过去30天"); private final String name; private TimePeriod(String name) { this.name = name; } @Override public String toString() { return name; } }
我意识到将枚举的值复制到列表可能没有意义,但我正在使用一个需要列表值作为输入并且无法使用枚举的库。
编辑日期:2/5/2010:
大多数提出的答案非常相似,并建议做类似于以下的操作:
class Filter> { private List availableOptions = new ArrayList (); private T selectedOption; public Filter(T selectedOption) { Class clazz = (Class ) selectedOption.getClass(); for (T option : clazz.getEnumConstants()) { availableOptions.add(option); } } }
如果我能确保selectedOption具有非空值,那么这个方法将非常有效。不幸的是,在我的用例中,这个值经常是空的,因为还有一个public Filter()的无参构造函数。这意味着我不能执行selectedOption.getClass(),否则会得到一个NPE。这个过滤器类管理一个可用选项的列表,其中的选项是被选中的。当没有选中任何选项时,selectedOption是null。
我所能想到的解决办法是在构造函数中传递一个Class。所以类似这样:
class Filter> { private List availableOptions = new ArrayList (); private T selectedOption; public Filter(Class clazz) { this(clazz,null); } public Filter(Class clazz, T selectedOption) { this.selectedOption = selectedOption; for (T option : clazz.getEnumConstants()) { availableOptions.add(option); } } }
有没有办法在构造函数中不需要额外的Class参数来完成这个任务?