Как конвертировать MultiMap в Map> с помощью Guava?

Я использую MultiMap из Google Guava 12 следующим образом:

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

после вставки значений в этот multimap мне нужно вернуть:

Map<Integer, Set<OccupancyType>>

однако, когда я делаю:

return pkgPOP.asMap();

Это возвращает меня

Map<Integer, Collection<OccupancyType>>

как я могу вернуть ?

2 ответов


посмотреть этот вопрос и комментарий № 2 Кевина Бурриллиона, глава Guava dev:

вы можете дважды бросить Map<K, Collection<V>> сначала к необработанной карте и затем к Map<K, Set<V>> что вы хотите. Вам придется подавить непроверенное предупреждение, и вы должны прокомментировать в этот момент,"безопасно, потому что SetMultimap гарантирует это." Я даже могу обновить SetMultimap javadoc упомянуть этот трюк.

так что снят В ролях:

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

EDIT:

начиная с Guava 15.0 вы можете использовать вспомогательный метод чтобы сделать это более элегантно:

Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP);

Guava contributor здесь:

выполнить опасный бросок. Это будет безопасно.

он не может возвратить Map<K, Set<V>> из-за того, как работает наследование Java. По сути,Multimap supertype должен вернуть Map<K, Collection<V>>, а потому Map<K, Set<V>> не является подтипом Map<K, Collection<V>>, вы не можете переопределить asMap() возвратить Map<K, Set<V>>.