2012-06-26 15 views
5

estoy usando Google MultiMap de guayaba 12 así:¿Cómo puedo convertir MultiMap <Integer, Foo> en Map <Integer, Set <Foo>> usando Guava?

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

después de insertar valores en este multimap, tengo que volver:

Map<Integer, Set<OccupancyType>> 

Sin embargo, cuando lo haga:

return pkgPOP.asMap(); 

Me devuelve

Map<Integer, Collection<OccupancyType>> 

¿Cómo puedo devolver Map<Integer, Set<OccupancyType>> en su lugar?

Respuesta

13

Mira this issue and comment #2 by Kevin Bourrillion, jefe de guayaba dev:

Puede hacer doble emitir el Map<K, Collection<V>> primero en un mapa crudo y luego a la Map<K, Set<V>> que desea. Tendrá que suprimir una advertencia desmarcada y debería comentar en ese punto, "Seguro porque SetMultimap lo garantiza". Incluso puedo actualizar el SetMultimap javadoc para mencionar este truco.

también lo hacen fundido sin control:

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

EDIT:

Desde guayaba 15.0 se puede utilizar helper method hacer esto en forma más elegante:

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

+1 para el enlace y la muestra. ¡Gracias! – brainydexter

+0

Estaba seguro de que el reparto de la derecha tenía que estar en el 'Mapa' simple, pero tal vez eso se debía a una versión de javac que ya no nos importa ... no estoy seguro. –

8

guayaba colaborador aquí:

Hacer el molde inseguro. Estará a salvo.

No puede devolver un Map<K, Set<V>> debido a la forma en que funciona la herencia de Java. Básicamente, el supertipo Multimap tiene que devolver un Map<K, Collection<V>>, y como Map<K, Set<V>> no es un subtipo de Map<K, Collection<V>>, no puede anular asMap() para devolver un Map<K, Set<V>>.

+0

Louis, se no duermas para nada, ¿verdad? ;) – Xaerxess

+0

¿Importa qué implementación utilizo para (Configurar) MultiMap? (en mi caso, estoy usando HashMultiMap). ¿Se romperá el infierno si utilizo algo como esto: 'SetMultiMap mapOfSets = LinkedListMultiMap.create()' – brainydexter

+0

Bueno, 'LinkedListMultimap' es un' ListMultimap', no un 'SetMultimap'. Siempre que use _some_ implementación 'SetMultimap', p. 'LinkedHashMultimap' o' TreeMultimap', estás bien. (Y @Xaerxess, estoy en horario del Reino Unido durante todo el verano.) –

Cuestiones relacionadas