假设我们有以下枚举:
public enum AnimalImages {
TIGER,BEAR,WOLF;
}
public enum CarImages {
BMW,VW,AUDI;
}
现在我想将这些枚举类保存在HashMap:中
Map<String,Enum<?>> enumMap=new HashMap<String,Enum<?>>();
enumMap.put("AnimalImages",???????);
我应该输入什么而不是问号?
要明确回答您的问题,您必须将枚举值设置为:
Map<String,Enum<?>> enumMap=new HashMap<String,Enum<?>>();
enumMap.put("AnimalImages", AnimalImages.TIGER);
然而,如果你想把所有属于枚举的值都放进去,那么你可以利用values()
方法,也可以把映射改为Map<String,Enum<?>[]>
,这样你就可以使用这个:
Map<String,Enum<?>[]> enumMap=new HashMap<String,Enum<?>[]>(); // Note Enum<?>[] array
enumMap.put("AnimalImages", AnimalImages.values());
enumMap.put("CarImages", CarImages.values());
另一种缩短签名的方法可以是这样的:
Map<String, Object> enumMap = new HashMap<String,Object>();
enumMap.put("AnimalImages", AnimalImages.values());
enumMap.put("CarImages", CarImages.values());
bali182在此评论中指出的另一种方式,您可以使用:
Map<String, Collection<? extends Enum<?>>> enumMap = new HashMap<>();
enumMap.put("AnimalImages", Arrays.asList(AnimalImages.values()));
enumMap.put("CarImages", Arrays.asList(AnimalImages.values()));
回答您的问题:
enumMap.put("AnimalImages", AnimalImages.WOLF);
enumMap.put("Cars", CarImages.AUDI);
但你也可以做
Map<String, AnimalImages> enumMap = new HashMap<String, AnimalImages>();
通过这种方式enumMap.get("AnimalImages")
,通过这种方式您不必键入check并强制转换它。
如果要求创建一个包含给定enum
的所有值的Map
,我会使用String
键到EnumSet
值的映射:
Map<String, EnumSet<?>> enumMap = new HashMap<String, EnumSet<?>>();
enumMap.put("AnimalImages", EnumSet.allOf(AnimalImages.class));
enumMap.put("CarImages", EnumSet.allOf(CarImages.class));
for (Map.Entry<String, EnumSet<?>> e : enumMap.entrySet()) {
System.out.println(String.format("key: [%s], values: %s",
e.getKey(), e.getValue().toString()));
}
EnumSet
是专门的Set
实现,它在内部表示为位向量。它的唯一目的是提供一种高效、简单的方法来存储enum
s。