继这个问题之后,它提供了一个解决方案但没有解释它(不幸的是,答案中的链接现在已经死了):
采取以下方法:
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 ?>>
怎么回事?Map.entrySet()
被指定为返回一个 类型的对象Set<Map.Entry<K, V>>
,所以在上面的例子中,myMap.entrySet()
返回一个Set<Map.Entry<?, ?>>
. 但它不编译!
更奇怪的是,从顶部的链接问题中,将方法更改为此使其编译:
void method(Map<?, ?> myMap) {
Set<? extends Map.Entry<?, ?>> set = myMap.entrySet();
...
}
怎么回事???调用entrySet
aMap<?, ?>
返回 aSet<Map.Entry<K, V>>
,它不能分配给 type 的变量Set<Map.Entry<K, V>>
,但Set<? extends Map.Entry<K, V>>
?????
谁能解释这里发生了什么?这是否意味着,每当我使用至少 2 层深度的通配符类型编写方法时,我必须记住在? extends ...
某个地方创建它?