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

jal*_*ezp 13 java

我正在编写一个包含大量枚举的程序,而且我必须经常返回EnumMap的键集.但是EnumMap.keySet()返回一个Set(),所以为了得到EnumSet我想要的,我必须使用一个演员:

EnumMap<SomeEnum, Object> myMap = getMap();
EnumSet<SomeEnum> myEnum = (EnumSet<SomeEnum>) myMap.keySet();
Run Code Online (Sandbox Code Playgroud)

如果我不投,编译器会抱怨类型不匹配; 它无法转换Set<SomeEnum>EnumSet<SomeEnum>.似乎没有必要强制转换它,因为EnumMap的键始终是枚举.有谁知道为什么这个keySet()方法是这样构造的?我有时认为它可能与EnumSet是一个抽象类有关,但肯定EnumMap可以返回所EnumSet提供的工厂方法.

干杯,全部!

编辑:我很抱歉,上面的代码抛出了一个CastClassException.您可以使用获取EnumSet

EnumSet<SomeEnum> myEnum = EnumSet.copyOf(myMap.keySet());
Run Code Online (Sandbox Code Playgroud)

我真的应该在发布前检查.

Pet*_*rey 8

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

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

myMap.keySet().removeAll(keysToRemove); // removes multiple keys.
Run Code Online (Sandbox Code Playgroud)