据我所知,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>>
确实有效?