Map 中 Set 的通配符 - return 类型不兼容 - 为什么?
Wildcard for Set in Map - return type incompatible - Why?
以下是设置我的问题情况的示例代码:
Foo接口:
interface Foo<K> {
Map<K, Set<? extends Foo<K>>> map();
Set<? extends Foo<K>> set(); }
栏界面:
interface Bar<K> extends Foo<K> {}
FooBar class(选项 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 class(选项 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 作为“? extends Foo”的通配符匹配项。它适用于 set() 方法,但不适用于 map() 方法。有人可以向我解释为什么它会这样吗以及是否有解决方法?
原来的例子比较复杂,我会用一些简化的方法
在你的例子中Foo.set()
returnsSet<? extends X>
如果Y extends X
那么Set<Y>
ISSet<? extends X>
但是Foo.map()
returnsMap<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
泛型不好解释,我尽力了。如果不清楚,请添加问题作为评论
以下是设置我的问题情况的示例代码:
Foo接口:
interface Foo<K> {
Map<K, Set<? extends Foo<K>>> map();
Set<? extends Foo<K>> set(); }
栏界面:
interface Bar<K> extends Foo<K> {}
FooBar class(选项 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 class(选项 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 作为“? extends Foo”的通配符匹配项。它适用于 set() 方法,但不适用于 map() 方法。有人可以向我解释为什么它会这样吗以及是否有解决方法?
原来的例子比较复杂,我会用一些简化的方法
在你的例子中Foo.set()
returnsSet<? extends X>
如果Y extends X
那么Set<Y>
ISSet<? extends X>
但是Foo.map()
returnsMap<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
泛型不好解释,我尽力了。如果不清楚,请添加问题作为评论