使用Java泛型迭代枚举值

16 浏览
0 Comments

使用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对象的方法:

Filter filter = 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参数来完成这个任务?

0