使用Map.entrySet()时类型不匹配

时间:2015-08-21 15:12:06

标签: java eclipse generics capture type-mismatch

我遇到以下情况:在下面的代码中,方法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<?>

2 个答案:

答案 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