为什么EnumMap <t> .keySet()返回Set <t>()而不是EnumSet <t>()?</t> </t> </t>

时间:2012-05-08 18:23:57

标签: java

我正在编写一个包含大量枚举的程序,而且我必须经常返回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());

我真的应该在张贴之前检查过。

4 个答案:

答案 0 :(得分:8)

我认为是因为keySet不是EnumSet。 ;)

不是因为keySet是底层地图的视图。

myMap.keySet().removeAll(keysToRemove); // removes multiple keys.

答案 1 :(得分:3)

EnumSetSet的一个实现,恰好使用枚举来表示密钥空间。类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

希望这可以帮到你。

享受!