2012-06-26 15 views

Odpowiedz

13

Spójrz na this issue and comment #2 by Kevin Bourrillion, szef Guava dev:

można dwukrotnie rzucić Map<K, Collection<V>> pierwszy surowego Mapa i następnie do Map<K, Set<V>> które chcesz. Musisz ukryć niezaznaczone ostrzeżenie i powinieneś w tym miejscu skomentować: "Bezpiecznie, ponieważ gwarantuje to ta funkcja." Mogę nawet zaktualizować javadoc SetMultimap , aby wspomnieć o tej sztuczce.

Więc niezaznaczone Obsada:

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

EDIT:

Od Guava 15.0 można użyć helper method to zrobić w bardziej elegancki sposób:

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

+1 dla linku i próbki. Dzięki! – brainydexter

+0

Byłem pewien, że prawy rzut musi być prostą "Mapą", ale być może to było spowodowane wersją javaca, którego już nie obchodzi ... nie jestem pewien. –

8

Guava specjalista tutaj:

Wykonaj niebezpieczny obsady. To będzie bezpieczne.

Nie można zwrócić wartości Map<K, Set<V>> ze względu na sposób działania dziedziczenia Java. Zasadniczo, nadprodukcja Multimap musi zwrócić wartość Map<K, Collection<V>>, a ponieważ Map<K, Set<V>> nie jest podtypem Map<K, Collection<V>>, nie można zastąpić asMap(), aby zwrócić wartość Map<K, Set<V>>.

+0

Louis, ty nie śpij wcale, prawda? ;) – Xaerxess

+0

Czy to ma znaczenie dla jakiej implementacji używam (Set) MultiMap? (w moim przypadku używam HashMultiMap). Czy wszystko pójdzie na marne, jeśli użyję czegoś takiego: 'SetMultiMap mapOfSets = LinkedListMultiMap.create()' – brainydexter

+0

Cóż, 'LinkedListMultimap' jest' ListMultimap', a nie 'SetMultimap'. Dopóki używasz _some_ implementacji 'SetMultimap', np. 'LinkedHashMultimap' lub' TreeMultimap', wszystko w porządku. (I @Xaerxess, jestem w Wielkiej Brytanii na czas lata.) –