Java泛型集合通配符捕获

时间:2014-05-29 17:26:49

标签: java eclipse generics

据我所知,Java泛型的复杂性可能会......错综复杂。我想如果我有一个带有Collection<? extends FooBar>的Google Guava多图,我应该可以使用getMap()将其分配给Map<String, ? extends FooBar>。但我不能在Eclipse 4.4RC2中这样做;它告诉我,&#34;类型不匹配:无法从Map<String,Collection<capture#1-of ? extends EclipseGenerics.FooBar>>转换为Map<String,Collection<? extends EclipseGenerics.FooBar>>&#34;。

import java.util.*;

import com.google.common.collect.*;

public class EclipseGenerics {

  public static interface FooBar {
    public String getFoo();
  }

  public static <FB extends FooBar> SetMultimap<String, FB> groupFooBarByBar(final Iterable<FB> foobars) {
    final SetMultimap<String, FB> groupedFoobars = HashMultimap.create();
    for (final FB foobar : foobars) {
      groupedFoobars.put(foobar.getFoo(), foobar);
    }
    return groupedFoobars;
  }

  public static void test() {
    Collection<FooBar> foobars = new ArrayList<>();
    final SetMultimap<String, ? extends FooBar> groupedFooBars = groupFooBarByBar(foobars);
    //why can't I do this?
    final Map<String, Collection<? extends FooBar>> map = groupedFooBars.asMap();
  }

}

我不能这样做:

final Map<String, Collection<? extends FooBar>> map = groupedFooBars.asMap();

为什么不呢? asMap()应该返回Map<K,Collection<V>>

但我能做到这一点!

final Map<String, ? extends Collection<? extends FooBar>> map = groupedFooBars.asMap();

我在Oracle的Java 1.8 javac编译器中遇到了类似的错误,因此Eclipse 4.4RC2和Oracle都是错误的,或者(更有可能)我还不是Java泛型的完整专家。 / p>

任何人都在解释为什么Map<String, Collection<? extends FooBar>>无效,但Map<String, ? extends Collection<? extends FooBar>>确实有效?

0 个答案:

没有答案