假设我有一个基本的枚举:
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()
不可用。我在这里做错了什么?
答案 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
的类型。
对于您问题中的具体情况,您可能最好使用Guava的Lists.newArrayList
:
List<Color> days = Lists.newArrayList(Color.values());