gpt4 book ai didi

java - 遍历 java 中的通用 HashMap

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:49:14 25 4
gpt4 key购买 nike

我的抽象类 Drawn 中有这个 hashmap,我的目的是用扩展 Drawn 的每个类的每个实例填充它。我像这样初始化 map :

public static HashMap<Integer, ? extends Drawn> drawns = new HashMap();

我尝试像这样将元素添加到哈希表中:

//this code is in the abstract class Drawn()
public void init(){
idCount++;
setID(idCount);
drawns.put(idCount,this);

}

然后我尝试像这样迭代:

for(<Integer, ? extends Drawn> E : Drawn.drawns.values()) {
E.draw();
}

迭代器和 init() 代码都有编译时错误。但是,如果我将类型参数更改为 Drawn 而不是我可以编译所有内容,但是当我将子类的实例添加到哈希表时,迭代器不会检测到它们。

最佳答案

对于 init 中的“放置”部分- 问题是你说它是 某种类型的值 的映射,其中该类型扩展了 Drawn ,但你没有说它是什么。这意味着您不能合法地输入任何条目。您确实需要将其更改为Map<Integer, Drawn>。 - 这对子类来说绝对没问题,下面的迭代代码仍然没问题。

你不能做你想做的事情的原因是类型系统试图防止这种问题:

Map<Integer, String> stringMap = new HashMap<Integer, String>();
Map<Integer, ? extends Object> objectMap = stringMap; // This is fine
objectMap.put(10, new Object()); // This *mustn't* be valid...
String value = stringMap.get(10); // Or this would be dangerous

当您从 map 中获取一个值时,您只会知道它是一个 Drawn引用 - 如果您想使用任何特定于子类的方法,您需要转换为正确的类型。如果您想要一个可以具有多种不同类型值的 map ,这是不可避免的。

当你在 values 上迭代时,你可以使用:

for (Drawn drawn : Drawn.drawns.values()) {
drawn.draw();
}

或者如果您还需要 key :

// Or Map.Entry<Integer, Drawn> after the earlier change
for (Map.Entry<Integer, ? extends Drawn> entry : Drawn.drawns.entrySet()) {
// Use entry.getKey() and entry.getValue() here
}

关于java - 遍历 java 中的通用 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18349676/

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