8

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

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()不是。我在这里做错了什么?

4

5 回答 5

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

使用 E 作为类中的类型。

于 2012-07-15T11:51:36.053 回答
4

有关原始问题的答案,请参见 Istvan Devai。

对于后续操作,诸如values()静态方法之类的方法,因此尝试从泛型参数中获取它是不走运的。作为一个糟糕的解决方案,您可以将枚举的Class对象传递给构造函数。并使用Class.getEnumConstants. 但是你最好传入MyEnum.values()构造函数而不是类,因此完全避免反射。没有一个合理的枚举元类真是太可惜了。

于 2012-07-15T12:53:20.183 回答
1

Anenum真正声明了一个派生自 的类Enum。因此,您可以使用:

public class MyClass<T extends Enum> { }
于 2012-07-15T11:50:19.687 回答
1

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

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

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);
  }
}
于 2012-11-30T14:45:38.780 回答
0

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

对于您问题中的特定情况,您最好使用GuavaLists.newArrayList

List<Color> days = Lists.newArrayList(Color.values());
于 2012-11-30T14:58:49.117 回答