13

私は多くの列挙を含むプログラムを書いており、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

4 に答える 4

8

keySetは ではないためだと思いますEnumSet。;)

そうでない理由は、keySetが下にあるマップのビューだからです。

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

EnumSetSetキースペースを表すためにたまたま列挙型を使用する実装です。このクラスは追加の非静的メソッドを提供しないため、単にプレーンなEnumSetを返す理由はありません。EnumSetSet

于 2012-05-08T18:43:49.237 に答える
2

編集:私は間違っていました、無視してください。

EnumMap は、keySet を宣言する AbstractMap を拡張します。AbstractMap は、AbstractMap の他のサブクラスには当てはまらないため、keySet が EnumSet を返すことを宣言できません。したがって、戻り値の型は Set です。

于 2012-05-08T18:44:58.660 に答える
0

そのクラスのソースに移動すると、返される理由をよりよく理解できますSet。以下のURLで確認できます

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

これがあなたを助けることを願っています。

楽しみ !

于 2012-05-08T18:34:26.157 に答える