Java 使用泛型返回类型提取表达式后类型不匹配

Java 使用泛型返回类型提取表达式后类型不匹配,java,generics,types,refactoring,capture,Java,Generics,Types,Refactoring,Capture,在执行提取表达式重构时,我在Eclipse4.4和Java8Build45中偶然发现了一些奇怪的行为,至少对我来说是这样。以下示例显示了应用提取重构之前的原始代码和无错误代码: import java.util.Map; import java.util.Set; public class MyMap<K, V> { public void putAll(final Map<? extends K, ? extends V> mapToCopy) {

在执行提取表达式重构时,我在Eclipse4.4和Java8Build45中偶然发现了一些奇怪的行为,至少对我来说是这样。以下示例显示了应用提取重构之前的原始代码和无错误代码:

import java.util.Map;
import java.util.Set;

public class MyMap<K, V> {
    public void putAll(final Map<? extends K, ? extends V> mapToCopy) {
        for (Map.Entry<? extends K, ? extends V> entry : mapToCopy.entrySet()) {
        }
    }
}

我将
entrySet
的声明类型更改为
Set让我们首先查看原始源代码:

public void putAll(final Map<? extends K, ? extends V> mapToCopy) {
    for (Map.Entry<? extends K, ? extends V> entry : mapToCopy.entrySet()) {
    }
}

然后编译器将没有证据表明
入口集
Map.EntryNote
Set@AndyBrown:请你详细说明一下“注意[…]会起作用”好吗。我必须修改什么才能使其工作?在java8中,也可以尝试
map.forEach((键,值)->{…})
。键/值被推断为正确的类型,例如K/V的一些未知子类型。如果我们指定类型-
map.forEach((K键,V值)->{…}),API也足够灵活。
感谢您的回复。为什么第三个代码段在循环语句中显示指示的错误?我无法复制。在我的第三段代码中,声明语句中指出了错误。我认为,问题与for循环无关。我详细阐述了这个问题,并开始了新的思路。
    public void putAll(final Map<? extends K, ? extends V> mapToCopy) {
        Set<Map.Entry<? extends K, ? extends V>> entrySet = mapToCopy.entrySet(); 
                                                            ^^^^^^^^^^^^^^^^^^^^
        for (Map.Entry<? extends K, ? extends V> entry : 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>>
public void putAll(final Map<? extends K, ? extends V> mapToCopy) {
    for (Map.Entry<? extends K, ? extends V> entry : mapToCopy.entrySet()) {
    }
}
public void putAll(final Map mapToCopy) {
    for (Iterator<Map.Entry> iterator = mapToCopy.iterator; iterator.hasNext();) {
    }
}
public void putAll(final Map<? extends K, ? extends V> mapToCopy) {
    Set<Entry<? extends K, ? extends V>> entrySet = mapToCopy.entrySet();
                                                    ^^^^^^^^
    for (Map.Entry<? extends K, ? extends V> entry : entrySet) {

    }
}