12

私は次のようにGoogleGuava12のMultiMapを使用しています。

Multimap<Integer, OccupancyType> pkgPOP = HashMultimap.create();

このマルチマップに値を挿入した後、次を返す必要があります。

Map<Integer, Set<OccupancyType>>

しかし、私がそうするとき:

return pkgPOP.asMap();

それは私を返します

Map<Integer, Collection<OccupancyType>>

代わりにどうすれば戻ることができMap<Integer, Set<OccupancyType>>ますか?

4

2 に答える 2

21

この問題を見て、Guava開発者の責任者であるKevin Bourrillionによるコメント#2

Map<K, Collection<V>>最初に生のマップに、次に必要なマップにダブルキャストできMap<K, Set<V>>ます。チェックされていない警告を抑制する必要があり、その時点で「SetMultimapがこれを保証するので安全です」とコメントする必要があります。このトリックに言及するために、SetMultimapjavadocを更新することもできます。

したがって、チェックされていないキャストを実行します。

@SuppressWarnings("unchecked") // Safe because SetMultimap guarantees this.
final Map<Integer, Set<OccupancyType>> mapOfSets = 
    (Map<Integer, Set<OccupancyType>>) (Map<?, ?>) pkgPOP.asMap();

編集:

Guava 15.0以降、ヘルパーメソッドを使用してこれをよりエレガントな方法で行うことができます。

Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP);
于 2012-06-26T10:17:25.367 に答える
10

ここでグアバの貢献者:

安全でないキャストを行います。安全です。

Map<K, Set<V>>Java継承の仕組みが原因で、を返すことはできません。基本的に、Multimapスーパータイプはを返す必要があり、はのサブタイプではないMap<K, Collection<V>>ため、オーバーライドしてを返すことはできません。Map<K, Set<V>>Map<K, Collection<V>>asMap()Map<K, Set<V>>

于 2012-06-26T10:04:38.923 に答える