我遇到以下情况:在下面的代码中,方法self.loadLayerSource = function() {
alert(layerType);
};
在foo
方法胜出时编译。在方法调用bar
(在代码中指示),编译器说:
entrySet
有趣的是,Eclipse的quickfix建议
Type mismatch: cannot convert
from Set<Map.Entry<capture#1-of ? extends K,capture#2-of ? extends V>>
to Set<Map.Entry<? extends K,? extends V>>
仅更改代码,因为quickfix忽略了自己的提案并将Change type of 's' to Set<Entry<? extends K, ? extends V>>
的类型更改为s
。
我正在使用JDK1.8.0_51和Eclipse 4.4.0。也许它与通配符或捕获有关?任何帮助或建议将不胜感激。提前谢谢!
Set<?>
答案 0 :(得分:3)
想象一下K和V是数字。声明不会将传递给地图的类型链接到条目集中使用的类型。虽然我们知道它永远不会发生,但如果map是Map<Integer,Integer>
,则声明允许s为Set<Entry<Double,Double>>
,因为它仍然扩展了数字。
因此,如果您明确表示这些类型匹配,请写下:
public <K0 extends K, V0 extends V> void bar(Map<K0,V0> map) {
Set<Entry<K0,V0>> s = map.entrySet();
}
你的意思是明确的,即&#39;的类型。将完全匹配&#39; map&#39;的类型。因此它很快乐地编译。
答案 1 :(得分:2)
简短的回答是,如果您按照问题中的方式声明了Set,则可以向其中添加不符合传入方法的对象类型的条目。 Java没有保留足够的信息来检查Set定义中的“?extends K”是否与方法参数中的“?extends K”相同。
为了避免这种情况,Java要求您将赋值声明为:
Set<? extends Map.Entry<? extends K,? extends V>> s = map.entrySet();
...你会发现你不能将自己的条目添加到这个集合中 - 至少,不是没有做很多糟糕的演员会产生很多警告。
如上所述,此问题更详细地介绍了该主题:Generic Iterator on Entry Set