gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:10:04 26 4
gpt4 key购买 nike

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

有趣的是,Eclipse 的 quickfix 建议

Change type of 's' to Set<Entry<? extends K, ? extends V>>

这只会更改代码,因为 quickfix 忽略了自己的建议并更改了 s 的类型至 Set<?>相反。

我正在使用 JDK1.8.0_51 和 Eclipse 4.4.0。也许它与通配符或捕获有关?任何帮助或建议将不胜感激。提前致谢!

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class MyClass<K, V> {
public void foo(Set<Entry<? extends K, ? extends V>> set) {
Iterator<Entry<? extends K, ? extends V>> i = set.iterator();
}

public void bar(Map<? extends K, ? extends V> map) {
Set<Entry<? extends K, ? extends V>> s = map.entrySet();
^^^^^^^^^^^^^^
}
}

最佳答案

假设 K 和 V 是数字。该声明不会将随映射传入的类型链接到条目集中使用的类型。虽然我们知道这永远不会发生,但如果 map 是 Map<Integer,Integer>那么声明允许 s 是 Set<Entry<Double,Double>>因为它仍然扩展了 Number。

因此,如果您明确表示这些类型匹配,可以这样写:

public <K0 extends K, V0 extends V> void bar(Map<K0,V0> map) {
Set<Entry<K0,V0>> s = map.entrySet();
}

您的意思很明确,“s”的类型将与“map”的类型完全匹配。因此它编译愉快。

关于java - 使用 Map.entrySet() 时类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32143844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com