2016-04-11 2 views
0

現在、Multisapを使用して重複を許可するMultimapクラスを実装しています。特に、私はboolean putAll(Multimap<? extends K, ? extends V> multimap)メソッドに取り組んでいます。Guava:マルチマップを汎用スーパータイプにキャストすることは有効ですか?

私はこれやりたい:asMap()は通常Map<? extends K, Collection<? extends V>>を返す

Map<K, Collection<V>> map = ((Multimap<K, V>)multimap).asMap(); 

を。

これは有効です(マップに追加しない限り、エラーは発生しません)。そうでない場合は、どうすれば修正できますか?

+1

なぜそれをしたいですか? 'putAll'の引数は読み込み専用で使われるので、'?あなたが欲しいものです。 –

+0

@PaulBoddington私はそれから 'asMap()'オブジェクトを取得したいと思います。しかし、私はこのメソッドを呼び出して 'Map >'を取得しようとすると、このメソッドはClassCastExceptionをスローすることに懸念しています。私はそれについてあまりよく知らないし、私の脳は少し燃えた。 – aspaltv

+0

型が消去されているため、 'ClassCastException'を受け取ることはありません。あなたは 'Map <? extends K、Collection > map = multimap.asMap(); '。 –

答えて

2

いいえ、それはList<T>List<Object>にキャストできないのと同じ理由で無効です。

Multimap.asMap()は、ビュー、according to the documentationを返します。つまり、

Multimap<K, V> multimap = ...; 
Map<SuperOfK, SuperOfV> map = (<some cast>) multimap.asMap(); 
map.put(superOfK, superOfV); 

マルチマップを更新する必要があります。

for (K key : multimap.keys()) { } 

したがって、そのようにキャストしても安全と入力されていないので、それは禁止です:これは、それ自体がClassCastExceptionをもたらさない一方で、キーを反復処理するようなものを考えやって。もちろん

、あなたのマルチマップは不変である場合は、この問題を持っていない - しかし、それは一般的に、あなたがいけない理由です。そして、「私はマップに追加しません」と言っても、コンパイラにとっては十分ではありません。

+0

私はマルチマップの更新を計画していません。 Map >オブジェクトを取得する有効な方法はありますか? – aspaltv

+0

"私は更新を計画していません"コンパイラはそれを知らない。唯一の方法は、データを明示的に正しいタイプの新しいデータ構造にコピーすることです。 –

+0

さて、私はそれを得た。私は、そのMultimapのビューである匿名クラスを作成します。助けてくれてありがとう、兄弟! – aspaltv

2

その他はあなたの特定の質問をカバーしているが、私はあなたが間違った質問をして(あなたがいけない何かをしようとしている)していると思います。

まず、私はあなたが自分でMultimapを実装しようとしている理由を聞いてみたいと思います。あなたはそれを避けることができるようです。

第二に、あなたはあなたのMultimap.putAll(Multimap)実装に渡さMultimapasMap()ビューを追加するmap.putAll(Map)を使用しようとしています。これはほぼ確実に間違っており、Multimap.putAllの仕様に違反します。 asMap()ビュー内のCollectionの値は、関連付けられたキーの値のライブビューで、その内容はに変更されます。これらのコレクションを直接に追加すると、Multimapの実装がサポートされている可能性があります。Multimapは、後でもう一方のMultimapが変更された場合に変更されます。それだけでなく、Mapに既にそのキーの値がある場合はどうなりますか?

関連する問題