使用 java 泛型迭代枚举值 [英] Iterate enum values using java generics

查看:39
本文介绍了使用 java 泛型迭代枚举值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找到一种在使用泛型时迭代枚举值的方法.不确定如何执行此操作或是否可能.

I'm trying to find a way to iterate through an enum's values while using generics. Not sure how to do this or if it is possible.

下面的代码说明了我想要做什么.请注意,代码 T.values() 在以下代码中无效.

The following code illustrates what I want to do. Note that the code T.values() is not valid in the following code.

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);
        }
    }
}

这是我将如何实例化过滤器对象:

Here is how I would instantiate a Filter object:

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;
    }
}

我意识到将枚举的值复制到列表中可能没有意义,但我使用的库需要一个值列表作为输入并且不能使用枚举.

I realize it might not make sense to copy a enum's values to a list, but I'm using a library that needs a list of values as input and won't work with enums.

编辑 2/5/2010:

EDIT 2/5/2010:

提出的大多数答案都非常相似,并建议做这样的事情:

Most of the answers proposed are very similar and suggest doing something like this:

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 具有非空值,这将非常有效.不幸的是,在我的用例中,该值通常为 null,因为还有一个 public Filter() 无参数构造函数.这意味着我不能在没有获得 NPE 的情况下执行 selectedOption.getClass() .此过滤器类管理可用选项列表,其中选择了哪些选项.当什么都没有选择时, selectedOption 为空.

This would work great if I can be sure that selectedOption has a non-null value. Unfortunately, in my use case, this value is often null, as there is a public Filter() no-arg constructor as well. This means I can't do a selectedOption.getClass() without getting an NPE. This filter class manages a list of available options which of the options is selected. When nothing is selected, selectedOption is null.

我唯一能想到的解决这个问题就是在构造函数中实际传入一个类.所以是这样的:

The only thing I can think to solve this is to actually pass in a Class in the constructor. So something like this:

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 参数的情况下做到这一点?

Any ideas how to do this without needing an extra Class parameter in the constructors?

推荐答案

这确实是一个难题.您需要做的一件事是告诉 java 您正在使用枚举.这是通过声明您为泛型扩展 Enum 类.但是这个类没有 values() 函数.所以你必须参加你可以获得价值的课程.

This is a hard problem indeed. One of the things you need to do is tell java that you are using an enum. This is by stating that you extend the Enum class for your generics. However this class doesn't have the values() function. So you have to take the class for which you can get the values.

以下示例应该可以帮助您解决问题:

The following example should help you fix your problem:

public <T extends Enum<T>> void enumValues(Class<T> enumType) {
        for (T c : enumType.getEnumConstants()) {
             System.out.println(c.name());
        }
}

这篇关于使用 java 泛型迭代枚举值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆