Java 映射中集合的通配符-返回类型不兼容-为什么?

Java 映射中集合的通配符-返回类型不兼容-为什么?,java,generics,dictionary,wildcard,return-type,Java,Generics,Dictionary,Wildcard,Return Type,以下是设置我的问题情况的示例代码: Foo接口: interface Foo<K> { Map<K, Set<? extends Foo<K>>> map(); Set<? extends Foo<K>> set(); } interface Bar<K> extends Foo<K> {} 接口Foo{ Map原始示例很复杂,我将使用一些简化 在您的示例中,Foo.set()返

以下是设置我的问题情况的示例代码:

Foo接口:

interface Foo<K> {

    Map<K, Set<? extends Foo<K>>> map();
    Set<? extends Foo<K>> set(); }
interface Bar<K> extends Foo<K> {}
接口Foo{

Map原始示例很复杂,我将使用一些简化

在您的示例中,
Foo.set()
返回
SetSee:,
class FooBar<K> implements Bar<K> {

    Map<K, Set<Bar<K>>> map;
    Set<Bar<K>> set;

    @Override
    public Map<K, Set<? extends Foo<K>>> map() {
        return map; }

    // For the above, Eclipse is yelling:
    // Type mismatch: cannot convert from 
    // Map<K,Set<Bar<K>>> to Map<K,Set<? extends Foo<K>>>

    // But Eclipse likes the following:
    @Override
    public Set<? extends Foo<K>> set() {
        return set; }  
}
class FooBar<K> implements Bar<K> {

    Map<K, Set<Bar<K>>> map;
    Set<Bar<K>> set;

    @Override
    public Map<K, Set<Bar<K>>> map() {
        return map; }

    // For the above, Eclipse is yelling:
    // The return type is incompatible with Foo<K>.map()

    // But Eclipse, again, likes the following:
    @Override
    public Set<Bar<K>> set() {
        return set; }  
}
Number number5 = 5;
Integer int5 = 5;
number5 = int5;  //OK

List<Number> listNumber5 = Arrays.asList(number5);
List<Integer> listInt5 = Arrays.asList(int5);
listNumber5 = listInt5; //ERROR

List<? extends Number> listExtendsNumber5 = Arrays.asList(number5);
listExtendsNumber5 = listInt5; // OK