Как конвертировать 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>>
.