Недавно я использовал много Guava Multimap.Почему не метод Java с аргументом Collection <? extends V> accept Set <V>?
Иногда мне нужно преобразовать Multimap<K,V>
и Map<K, Collection<V>
. Одно из направлений уже предоставлено API Guava: Multimap#asMap()
. Для другого направления, я написал простой метод полезности следующим образом:
public static <K,V> Multimap<K,V> multimapFromMap(Map<K, Collection<V>> map) {
Multimap<K,V> mmap = HashMultimap.create();
for (Map.Entry<K,Collection<V>> entry : map.entrySet())
mmap.putAll(entry.getKey(), entry.getValue());
return mmap;
}
Но когда я пытался писать
Map<String, Set<String>> aMap = ... ; // obtained from elsewhere
Multimap<String, String> mMap = multimapFromMap(aMap);
Я получаю сообщение об ошибке:
multimapFromMap(java.util.Map<String, java.util.Collection<?>>) cannot be applied to (java.util.Map<java.lang.String, java.util.Set<java.lang.String>>)
Но так как интерфейс Set
расширяет интерфейс Collection
, не должен мой код быть в порядке?
От Oracle Java Generics tutorial page, я вижу пример "... ArrayList<E>
реализует List<E>
и List<E>
расширяет Collection<E>
. Так ArrayList<String>
является подтипом List<String>
, который является подтипом Collection<String>
. До тех пор, пока вы не изменить аргумент типа , отношение подтипирования сохраняется между типами. "
дополнения, основанные на комментарии
- я заменил
V
сString
в методеmultimapFromMap
, только чтобы успокоить себя, что я не получаю некоторые дженерики связанных понятия путают, но ошибка повторяется с?
заменить с сообщением об ошибкеjava.lang.Object
.
Предположительно ваш код не так, как вы присваиваете 'mMap' к' Map'. Отправьте фактический SSCCE. –
@BoristheSpider: исправлено. –
@SotiriosDelimanolis Я не уверен. –