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();