Java 使用Map.entrySet()时类型不匹配
我有以下情况:在下面的代码中,方法Java 使用Map.entrySet()时类型不匹配,java,eclipse,generics,capture,type-mismatch,Java,Eclipse,Generics,Capture,Type Mismatch,我有以下情况:在下面的代码中,方法foo编译,而方法bar不会编译。在方法调用entrySet(代码中指出)时,编译器说: 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>> 假设K和V是数字。该声明不会将随映
foo
编译,而方法bar
不会编译。在方法调用entrySet
(代码中指出)时,编译器说:
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>>
假设K和V是数字。该声明不会将随映射传入的类型链接到条目集中使用的类型。虽然我们知道它永远不会发生,但如果map是
map
,那么声明允许s是Set
,因为这仍然扩展了数字
因此,如果明确表示这些类型匹配,请编写以下内容:
public <K0 extends K, V0 extends V> void bar(Map<K0,V0> map) {
Set<Entry<K0,V0>> s = map.entrySet();
}
公共空白栏(地图){
Set s=map.entrySet();
}
您的意思是明确的,“s”的类型将与“map”的类型完全匹配。因此,它可以很好地编译。简单的回答是,如果您以您在问题中的方式声明集合,则可以向其中添加不符合传递给该方法的对象类型的条目。Java没有保留足够的信息来检查集合定义中的“扩展K”是否与方法参数中的“扩展K”相同 为了避免这种情况,Java要求您将赋值声明为:
Set<? extends Map.Entry<? extends K,? extends V>> s = map.entrySet();
SetIntellij建议:SetCheck解释。你的例子很相似。
public <K0 extends K, V0 extends V> void bar(Map<K0,V0> map) {
Set<Entry<K0,V0>> s = map.entrySet();
}
Set<? extends Map.Entry<? extends K,? extends V>> s = map.entrySet();