在java中的容器的枚举

时间:2014-06-26 20:55:32

标签: java enums

在Java中,我可以这样做:

    enum Color {RED, BLUE, GREEN };
    enum Weight {LIGHT, HEAVY }

    Enum e = Color.RED;
    assertEquals(Color.RED, e);
    e = Weight.HEAVY;
    assertEquals(Weight.HEAVY, e);

我可以将枚举放在地图中,但仍然有效:

    Map<String, Enum> map = Maps.newHashMap();
    map.put("color", Color.RED);
    map.put("weight", Weight.HEAVY);
    assertEquals(Color.RED, map.get("color"));
    assertEquals(Weight.HEAVY, map.get("weight"));

但是,我无法对枚举的集合做同样的事情。

   List<Enum> enumList = new ArrayList<Color>();  //error

Java中不允许这样做,还是我做错了?

是否有更好的方法来维护属性到表示它们的枚举的映射?

6 个答案:

答案 0 :(得分:2)

列表的类型参数似乎不正确,

List<Enum> enumList = new ArrayList<Color>();

应该是

List<Enum> enumList = new ArrayList<Enum>();

或(使用diamond operator - Java 7及更高版本)

List<Enum> enumList = new ArrayList<>();

答案 1 :(得分:2)

List<? extends Enum> enumList = new ArrayList<Color>();

ColorEnum子类型,但List<Color> <{1}}的

你必须明确地说出“List<Enum>的子类型的列表”,它在Java中是:

Enum

答案 2 :(得分:2)

ArrayList将始终作为List运行。 Color将始终充当Enum

然而: ArrayList<Color> 将始终充当List<Enum>

示例:

    List<Enum> EvilList = new ArrayList<Color>();
    EvilList.add(Some other Enum);
    // Because EvilList is, in its definition, a List<Enum>, allowing your code to
    // compile would break the type safety that generics are meant to preserve.

但请注意,List<Color>不会破坏通用类型的安全性。

答案 3 :(得分:2)

您必须使用通配符进行此类任务:

List<? extends Enum> enumList = new ArrayList<Color>();

通配符允许这种赋值,虽然你不能对集合做某些事情......例如添加扩展Enum的元素(因为你不知道类型引用的对象)。你只能从Enum中获取元素。

如果您希望能够继续添加元素,请按以下方式创建数组列表:

ArrayList<Enum>

答案 4 :(得分:2)

Enum是一个泛型类,所以给它一个通用参数:

List<Enum<Colour>> l = new ArrayList<Enum<Colour>>();

可以缩短为:

List<Colour> l = new ArrayList<Colour>();

以下是有效代码:

    List<Enum<Colour>> ecl = new ArrayList<Enum<Colour>>();
    List<Colour> cl = new ArrayList<Colour>();
    ecl.add(Colour.Blue);
    cl.add(Colour.Blue);

答案 5 :(得分:0)

如果只有每个枚举的值来存储:

Map<Class<? extends Enum>, Enum<?>> map = new HashMap<Class<? extends Enum>, Enum<?>>();
map.put(Color.class, Color.BLUE);
map.put(Weight.class, Weight.LIGHT);
Color color = getFromMap(map, Color.class);

private static <T> T getFromMap(Map<Class<? extends Enum>, Enum<?>> map, Class<T> itemClass) {
    return (T) map.get(itemClass);
}

,否则

List<Enum<?>> list = new ArrayList<Enum<?>>();
list.add(Color.BLUE);
list.add(Weight.LIGHT);
Color fromList = getFromList(list, 1, Color.class);

private static <T> T getFromList(List<Enum<?>> list, int i, Class<Color> outType) {
    return (T) list.get(i);
}