Java 使用泛型返回类型提取表达式后类型不匹配
在执行提取表达式重构时,我在Eclipse4.4和Java8Build45中偶然发现了一些奇怪的行为,至少对我来说是这样。以下示例显示了应用提取重构之前的原始代码和无错误代码: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) {
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.EntryNoteSet@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) {
}
}