13

我正在编写一个包含大量枚举的程序,并且我不得不返回很多 EnumMap 的键集。但是EnumMap.keySet()返回 a 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

4 回答 4

8

我认为它是因为keySet不是EnumSet. ;)

它不是的原因是它是keySet底层地图的视图。

myMap.keySet().removeAll(keysToRemove); // removes multiple keys.
于 2012-05-08T18:29:36.453 回答
3

EnumSetSet碰巧使用枚举来表示键空间的一种实现。该类EnumSet没有提供额外的非静态方法,因此没有理由只返回EnumSet一个普通的Set

于 2012-05-08T18:43:49.237 回答
2

编辑:我错了,请忽略。

EnumMap 扩展了 AbstractMap,它声明了 keySet。AbstractMap 不能声明 keySet 返回 EnumSet,因为对于 AbstractMap 的其他子类不是这样。因此,它的返回类型是 Set。

于 2012-05-08T18:44:58.660 回答
0

如果你去那个类的来源,那么你会更好地理解它为什么返回的场景Set。您可以在以下网址找到

http://www.docjar.com/html/api/java/util/EnumMap.java.html

希望这可以帮到你。

享受 !

于 2012-05-08T18:34:26.157 回答