【发布时间】:2013-02-06 11:25:34
【问题描述】:
我有一个对象模型,它有一个父对象,我将在这里调用它 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() 的元素进行迭代,因为我需要从哈希图中删除一些元素。
这是我的代码中无法编译的部分:
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>
有什么想法吗?
【问题讨论】:
标签: java generics iterator hashmap covariance