2012-06-26 15 views
5

sto usando MultiMap da Google Guava 12 in questo modo:Come posso convertire MultiMap <Integer, Foo> in Map <Integer, Set <Foo>> usando Guava?

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

dopo aver inserito i valori in questo multimappa, ho bisogno di tornare:

Map<Integer, Set<OccupancyType>> 

Tuttavia, quando lo faccio:

return pkgPOP.asMap(); 

mi ci restituisce

Map<Integer, Collection<OccupancyType>> 

Come posso restituire Map<Integer, Set<OccupancyType>>?

risposta

13

Guardate this issue and comment #2 by Kevin Bourrillion, testa Guava dev:

È possibile fare doppio cast del Map<K, Collection<V>> prima ad una cruda Mappa e poi al Map<K, Set<V>> che si desidera. Dovrai sopprimere un avviso non controllato e dovresti commentare a questo punto, "Sicuro perché SetMultimap garantisce questo." Posso anche aggiornare il SetMultimap javadoc per menzionare questo trucco.

così fanno fusione incontrollata:

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

EDIT:

Dal Guava 15.0 è possibile utilizzare helper method di fare questo in modo più elegante:

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

+1 per il collegamento e il campione. Grazie! – brainydexter

+0

Ero sicuro che il cast più a destra doveva essere semplicemente 'Map', ma forse era dovuto a una versione di javac di cui non ci importa più ... non sono sicuro. –

8

Contribuente di guava qui:

Fare il cast pericoloso. Sarà al sicuro.

Non è possibile restituire un valore Map<K, Set<V>> a causa del modo in cui l'ereditarietà di Java funziona. In sostanza, il supertipo tipo Multimap deve restituire un Map<K, Collection<V>> e poiché Map<K, Set<V>> non è un sottotipo di Map<K, Collection<V>>, non è possibile sovrascrivere asMap() per restituire un Map<K, Set<V>>.

+0

Louis, è non dormire affatto, vero? ;) – Xaerxess

+0

Ha importanza quale implementazione uso per (Set) MultiMap? (nel mio caso, sto usando HashMultiMap). Si scatena l'inferno se uso qualcosa del genere: 'SetMultiMap mapOfSets = LinkedListMultiMap.create()' – brainydexter

+0

Bene, 'LinkedListMultimap' è un 'ListMultimap', non un' SetMultimap'. Finché utilizzi l'implementazione _some_ 'SetMultimap', ad es. 'LinkedHashMultimap' o' TreeMultimap', stai bene. (E @Xaerxess, sono in UK per la durata dell'estate.) –

Problemi correlati