枚举被声明为泛型参数时获取枚举的values()

时间:2012-01-09 17:04:35

标签: java generics enums

下面显示的代码确实有效,因为方法values()是静态的。我的问题是如果B不是通用的,我怎样才能实现下面的代码呢。

class A<B extends Enum<B>> {
    public A() {
        for (B b : b.values()) {

        }
    }
}

我可以想到两个解决方案:

  1. 将枚举值传递给A的构造函数
  2. 使B实现一个接口,该接口定义获取枚举值的方法。
  3. 对我来说,这两件事看起来都很混乱。有人有更好的解决方案吗?

2 个答案:

答案 0 :(得分:7)

尝试使用getEnumConstants()

答案 1 :(得分:1)

这是一个涉及JPanel子类的精简示例,让您可以使用单选按钮从Enum中选择一个值。要使用它,你会做类似的事情:

enum Animal { DOG, CAT, FISH };
RadioPanel<Animal> animal_panel = new RadioPanel<Animal>(Animal.class);
dialog.add(animal_panel);
...
Animal favorite_animal = animal_panel.getSelectedOption();

班级本身:

public class RadioPanel<T extends Enum<T>> extends JPanel {
    private Map<T,JRadioButton> buttons;
    private ButtonGroup button_group;
    private Class<T> clazz;

    public RadioPanel(Class<T> clazz) {
        this.clazz = clazz;
        buttons = new EnumMap<T, JRadioButton>(clazz);
        button_group = new ButtonGroup();       

        for (T value : clazz.getEnumConstants()) {
            JRadioButton button = new JRadioButton(value.toString());
            buttons.put(value, button);
            button_group.add(button);
            add(button);
        }
    }

    public void setSelectedOption(T value) {
        buttons.get(value).setSelected(true);
    }

    public T getSelectedOption() {
        for (T value : clazz.getEnumConstants()) {
            if (buttons.get(value).isSelected())
                return value;
        }

        return null;
    }
}
相关问题