如何迭代google集合的Multimap <?,Object>?

Rom*_*man 1 java generics collections guava

在使用谷歌收藏之前,我有类似于下一个代码:

private Set<A> aSet = ...;
private Set<B> bSet = ...;

public Foo getFoo (Map<?, List<Bar>> bars, Set<?> set) {
   for (Object item : set) {
      for (Bar bar : bars.get (item)) {
          //build foo;
      }
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

我能够像这样打电话:

Map<A, List<Bar> aMap = getAMap ();
Foo f1 = getFoo (aMap, aSet);
Map<B, List<Bar> bMap = getBMap ();
Foo f2 = getFoo (bMap, bSet);
Run Code Online (Sandbox Code Playgroud)

现在,使用Multimap,我不能这样做:

public Foo getFoo (Multimap<?, List<Bar>> bars, Set<?> set) {
   for (Object item : set) {

      // compile error: get(capture#621 of ?) in Multimap ... cannot be applied to java.lang.Object
      for (Bar bar : bars.get (item)) {
          //build foo;
      }
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

nan*_*nda 8

试试这个:

public <T> Foo getFoo (Multimap<T, List<Bar>> bars, Set<T> set) {
   for (T item : aSet) {

      // compile error: get(capture#621 of ?) in Multimap ... cannot be applied to java.lang.Object
      for (Bar bar : bars.get (item)) {
         //build foo;
      }
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:

如果你看到两个类的javadoc,你会发现Map的javadoc是:

V get(Object key) 
Run Code Online (Sandbox Code Playgroud)

而对于MultiMap是:

Collection<V> get(K key) 
Run Code Online (Sandbox Code Playgroud)

看到Map的参数没有生成.

MultiMap是通用的好,但地图的设计,因此具有与以往其向后兼容性Map从Java 1.4.

  • Multimap必须确定密钥的类型是正确的,因为您获得的集合是"直写"到多图本身.(即,您可以向其添加元素,并且相应的条目将出现在多图中;如果键的类型错误,则表示数据已损坏).Map没有这样的顾虑,并且在使用Object作为get()的参数类型时绝对正确. (3认同)