gpt4 book ai didi

java - 如何迭代泛型的 HashMap ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:53:34 30 4
gpt4 key购买 nike

我有一个对象模型,它有一个父对象,我将在这里调用它 MyParent.java。该类有两个子类,名为 MySub1.java 和 MySub2.java。

我有两个 HashMap,一个包含 MySub1 实例,另一个包含 MySub2 实例。我正在尝试做一段代码,它可以处理两个 HashMap 并做完全相同的事情(稍后,拥有 MySub1 或 MySub2 实例会产生一些影响,但不会在这里)。

这是编译的代码部分:

HashMap<String, ? extends MyParent> map = null;
if (some condition)
map = // get a HashMap<String, MySub1>
if (some other condition)
map = // get a HashMap<String, MySub2>

但是现在,我不知道如何迭代 map 变量。我需要通过一个迭代器而不是对 keySet() 的元素进行迭代来完成它,因为我需要从 HashMap 中删除一些元素。

这是我的代码中未编译的部分:

if(map != null && map.size() > 0){
Iterator<Entry<String, ? extends MyParent>> i = map.entrySet().iterator();
while(i.hasNext()){
Map.Entry<String, MyParent> pair = (Map.Entry<String, MyParent>) i.next();
// get the object from the pair and handle it
}
}

Eclipse 确实在我创建迭代器的行上向我打印了这条错误消息:

 cannot convert from Iterator<Map.Entry<String,capture#5-of ? extends MyParent>> to Iterator<Map.Entry<String,? extends MyParent>>

我真的没有收到错误消息。如果我将代码的第一行更改为:

HashMap<String, MyParent> map = null

现在不工作的代码可以工作,但是工作代码不再工作并出现此错误消息:

cannot convert from HashMap<String,MySub1> to HashMap<String,MyParent>

有什么想法吗?

最佳答案

您始终可以将一对 String 和 MyParent 实例放入 Map<String,MyParent> 中.您不能将那对放入 Map<String,MySub1> .因此,不可能从后者转换为前者 map (如上一条错误消息所述)。另见 wikipedia on covariance and contravariance .

相同问题的一个版本适用于迭代器。如果您的实际 map 是 Map<String,MySub1> , 它返回一个 Iterator<Map.Entry<String,MySub1>> ,它不能转换为 Iterator<Map.Entry<String,? extends MyParent>>即使Map.Entry<String,MySub1>Map.Entry<String,? extends MyParent> .例如,以下将编译:

Map.Entry<String,? extends MyParent> someEntry = map.entrySet().iterator().next(); .

另一个通配符 ( ?) 在这里有帮助:

Iterator<? extends Map.Entry<String, ? extends MyParent>> i =  map.entrySet().iterator();

关于java - 如何迭代泛型的 HashMap ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14997162/

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