Java:Generic只接受枚举类型

时间:2012-07-15 11:45:26

标签: java generics enums

假设我有一个基本的枚举:

public enum Color { Red, Green, Blue}

如何编写一个只接受“枚举类”的泛型类,以便该泛型类的具体实例可能看起来像MyClass<Color>

修改

实际上想要做的是编写一个包含函数的通用抽象类,该函数将所有枚举“条目”作为列表返回:

public abstract class EnumListBean<E extends Enum<E>> {

    public List<E> getEnumList() {
        return Arrays.asList(E.values());
    }

}

Day.values()可用时E.values()不可用。我在这里做错了什么?

5 个答案:

答案 0 :(得分:6)

public class EnumAcceptor<E extends Enum<E>> {
    ...
}

在课堂上使用E作为一种类型。

答案 1 :(得分:4)

请参阅Istvan Devai回答原始问题。

对于后续工作,像values()这样的方法是静态方法,所以你试图从泛型参数中获取它是不幸的。作为一个糟糕的解决方案,您可以将枚举的Class对象传递给构造函数。并使用Class.getEnumConstants。但是你也可以将MyEnum.values()传递给构造函数而不是类,因此完全避免反射。真的很遗憾没有一个明智的枚举元类。

答案 2 :(得分:1)

enum确实声明了一个派生自Enum的类。因此,您可以使用:

public class MyClass<T extends Enum> { }

答案 3 :(得分:1)

请注意,@ Istvan的解决方案只能接受enum元素,如果您想要的话,这很好。

虽然您无法将enum本身作为参数传递(因为它实际上没有等效的对象),但您可以指定必须接收class中的enum构造函数并从中导出enum的详细信息:

public class EnumAcceptor<E extends Enum<E>> {
  public EnumAcceptor(Class<E> c) {
    // Can get at the enum constants through the class.
    E[] es = c.getEnumConstants();
  }

  enum ABC {
    A, B, C;
  }

  public static void main(String args[]) {
    EnumAcceptor<ABC> abcAcceptor = new EnumAcceptor<ABC>(ABC.class);
  }
}

答案 4 :(得分:0)

由于类型擦除,您无法使用E.values() - 在运行时无法使用E的类型。

对于您问题中的具体情况,您可能最好使用GuavaLists.newArrayList

List<Color> days = Lists.newArrayList(Color.values());