在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中不允许这样做,还是我做错了?
是否有更好的方法来维护属性到表示它们的枚举的映射?
答案 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>();
Color
是Enum
的子类型,但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);
}