我正在编写一个包含大量枚举的程序,而且我必须经常返回EnumMap的键集。但是EnumMap.keySet()
会返回Set()
,所以为了获得我想要的EnumSet
,我必须使用演员:
EnumMap<SomeEnum, Object> myMap = getMap();
EnumSet<SomeEnum> myEnum = (EnumSet<SomeEnum>) myMap.keySet();
如果我不投,编译器会抱怨类型不匹配;它无法从Set<SomeEnum>
转换为EnumSet<SomeEnum>
。似乎没有必要强制转换它,因为EnumMap的键始终是枚举。有谁知道为什么keySet()
方法是这样建造的?我有时认为它可能与EnumSet是一个抽象类有关,但肯定EnumMap
可以返回EnumSet
提供的工厂方法。
干杯,全部!
编辑:我很抱歉,上面的代码抛出CastClassException
。您可以使用获取EnumSet
EnumSet<SomeEnum> myEnum = EnumSet.copyOf(myMap.keySet());
我真的应该在张贴之前检查过。
答案 0 :(得分:8)
我认为是因为keySet
不是EnumSet
。 ;)
不是因为keySet
是底层地图的视图。
myMap.keySet().removeAll(keysToRemove); // removes multiple keys.
答案 1 :(得分:3)
EnumSet
是Set
的一个实现,恰好使用枚举来表示密钥空间。类EnumSet
没有提供其他非静态方法,因此没有理由只返回EnumSet
Set
。
答案 2 :(得分:2)
编辑:我错了,请忽略。
EnumMap扩展了AbstractMap,它声明了keySet。 AbstractMap不能声明keySet返回EnumSet,因为对于AbstractMap的其他子类不是这样。因此,它的返回类型是Set。
答案 3 :(得分:0)
如果您转到该课程的来源,那么您将更好地了解它返回Set
的原因。你可以在url下面找到
http://www.docjar.com/html/api/java/util/EnumMap.java.html
希望这可以帮到你。
享受!