2012-05-08 9 views
13

私はたくさんの列挙型のプログラムを書いています。私はEnumMapのキーセットを多く返す必要があります。私が欲しいEnumSetを得るために、私はキャストを使用する必要があるのでしかし、Set()EnumMap.keySet()返す:私はキャストしていない場合、コンパイラは型の不一致を訴えるだろうEnumMap <T> .keySet()はEnumerSet <T>()ではなく、<T>()のセットを返します。

EnumMap<SomeEnum, Object> myMap = getMap(); 
EnumSet<SomeEnum> myEnum = (EnumSet<SomeEnum>) myMap.keySet(); 

を。 Set<SomeEnum>からEnumSet<SomeEnum>に変換できません。 EnumMapのキーは常に列挙型になるため、これをキャストする必要はありません。誰でもこの方法でkeySet()メソッドが構築された理由を知っていますか? EnumSetを抽象クラスとして扱うことがあると思ったことがありますが、確かにEnumMapは、ファクトリメソッドEnumSetを返すことができます。

乾杯!

編集:大変申し訳ございませんが、上記コードはCastClassExceptionです。

EnumSet<SomeEnum> myEnum = EnumSet.copyOf(myMap.keySet()); 

私は実際に投稿する前にチェックしておくべきでした。

+5

あなたは 'Set 'を取得します。 'EnumSet 'を取得するとどうなるでしょうか? –

+0

@PaulBelloraそうです、上記は間違っています。私はそれを修正します。 である必要があります。 'EnumSet myEnum = EnumSet.copyOf(myMap.keySet());' – jalopezp

+0

また、インラインスタイルのjavadocを使用した、ソースの素晴らしいビューがあります:http://grepcode.com/file/repository.grepcode.com /java/root/jdk/openjdk/6-b14/java/util/EnumMap.java#EnumMap.keySet%28%29 –

答えて

8

keySetEnumSetではないと思います。 ;)

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

+0

しかし、とにかく、何がポイントでしょうか? –

+0

概念的には、keySet()はenumまたはenumのセットです。 APIが異なって設計されていれば、EnumSetインタフェースを持つことができますが、これがSetと同じであれば、実用上の利点はありません。EnumSetによって実行時に要素型のようなEnum固有のメドゥを与えることができれば、おそらくそれは違いを生むかもしれません。 –

0

そのクラスのソースに行くと、なぜそれが戻ってくるのかをよく理解できます。Setあなたは、URL

以下

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

希望これはあなたを助けることができることを見つけることができます。

お楽しみください!

+0

それは本当にクールだ、私はこれのソースを見ることができたか分からなかった!私はAPIをすべて扱ってきました。しかし、ええ、私はkeySet()メソッドはスーパークラスで定義されているSet keySetを返すので、私は他の方法でそれを持つことはできませんでした。ありがとう、私は楽しむ! – jalopezp

+0

@jalopezpありがとうございました –

+3

あなたのリンクの800行のコードのどこに質問の答えがあると思いますか?該当する部分の抜粋を投稿してください。 – Gabe

3

EnumSetは、キー空間を表すためにenumを使用するSetの実装です。 EnumSetクラスは追加の非静的メソッドを提供しないので、EnumSetを平文で返す理由はありませんSet

+0

これまでのベストアンサーと単純なIMHO 。実装の詳細を参照していないか、またはapiデザインには関係ありません)、javaには共変な戻り型がないという悪い仮定があります(サブクラスはオーバーライドされたメソッドの戻り値のサブクラスを返すことができます)。 –

+0

+1これは、実際にはAPIデザインを下のコードよりも見た方が良いです。 –

2

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

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

+3

それは本当ではない、サブクラスはより具体的な戻り値を持つことができます。 java 5以降の共変の戻り値の型。 –

関連する問題