【发布时间】:2010-02-05 08:32:04
【问题描述】:
我正在尝试找到一种在使用泛型时迭代枚举值的方法。不确定如何执行此操作或是否可能。
以下代码说明了我想要做什么。请注意,代码 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 具有非空值,这将非常有用。不幸的是,在我的用例中,这个值通常为空,因为还有一个 public Filter() 无参数构造函数。这意味着我不能在没有 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 参数的情况下做到这一点?
【问题讨论】:
-
如果枚举常量是匿名子类 (example),
getClass代码也会失败。应该改用getDeclaringClass。
标签: java generics enums enumeration