继从这个问题 https://stackoverflow.com/questions/4459587/incompatible-generic-wildcard-captures,它提供了一个解决方案,但没有解释它(不幸的是,答案中的链接现在已失效):
采取以下方法:
void method(Map<?, ?> myMap) {
Set<Map.Entry<?, ?>> set = myMap.entrySet();
...
}
很简单,不是吗?但是,在 jdk1.7.0_25 上编译失败:
incompatible types
required: java.util.Set<java.util.Map.Entry<?,?>>
found: java.util.Set<java.util.Map.Entry<capture#1 of ?,capture#2 of ?>>
WTF? Map.entrySet()
被指定为返回类型的对象Set<Map.Entry<K, V>>
,所以在上面的例子中,myMap.entrySet()
返回一个Set<Map.Entry<?, ?>>
。但它无法编译!
更奇怪的是,从顶部的链接问题来看,将方法更改为这样可以使其编译:
void method(Map<?, ?> myMap) {
Set<? extends Map.Entry<?, ?>> set = myMap.entrySet();
...
}
WTF???呼唤entrySet
on a Map<?, ?>
返回一个Set<Map.Entry<K, V>>
,不能分配给类型的变量Set<Map.Entry<K, V>>
,但它可以是类型变量Set<? extends Map.Entry<K, V>>
?????
任何人都可以阐明这里发生的事情吗?这是否意味着,每当我使用通配符类型编写至少 2 级深度的方法时,我必须记住使其? extends ...
某处?