在地图中设置的通配符 - 返回类型不兼容 - 为什么?

时间:2015-03-05 11:52:23

标签: 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> {}

FooBar类(备选方案1):

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; }  
}

FooBar类(备选方案2):

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; }  
}

在备选方案1和2中,我使用Bar作为&#34;的通配符匹配?延伸Foo&#34;。它适用于set()方法,但它不适用于map()方法。有人可以向我解释为什么它会像那样,如果有解决方法吗?

1 个答案:

答案 0 :(得分:1)

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

在您的示例中Foo.set()返回Set<? extends X>

如果Y extends XSet<Y> Set<? extends X>

Foo.map()会返回Map<K, Set<? extends X>>

Map<K, Set<Y>> 不是 Map<K, Set<? extends X>>

Map<K, Set<Y>> IS Map<K, ? extends Set<? extends X>>

与以下

比较
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

泛型不容易解释,我尽了最大努力。如果不清楚,请添加问题作为评论