gpt4 book ai didi

Java HashSet 中的动态对象存储

转载 作者:行者123 更新时间:2023-12-01 22:31:04 24 4
gpt4 key购买 nike

我需要像这样存储不明确的对象(每个对象都有自己的类):

ObjectA 
ObjectB
ObjectC

创建的 HashSet 如下所示:

public static HashSet<Object> objects = new HashSet<Object>();

然后我一次将对象放入一个中:

object.add(new ObjectA());

但是问题在于,如果稍后我需要通过迭代来检索某些对象,如下所示:

for(Object obj : objects){
if(obj instanceof ObjectA){
// print that the object is A
}
}

什么也没有发生,即使我知道其中唯一的对象是 ObjectA,我也会得到这个异常:

Caused by: java.lang.ClassCastException: java.util.HashSet$Node cannot be cast to ***.*****.******.objects.ObjectA

这是什么原因造成的?为什么对象突然不再是它们自己的实例?

最佳答案

这个问题与泛型无关。这个问题跟Java有关,不知道是什么样的Object当你在做的时候你想要for (Object obj : objects) { ... } .

说明

我相信您输入的错误消息是错误的;我想应该是这样的(重点是我加的):

Caused by: java.lang.ClassCastException: java.util.HashMap$Node cannot be cast to ***.*****.******.objects.ObjectA

错误的原因是Java HashSet由 Java HashMap 支持与 null为了值(value)观。内部 HashMap使用 HashMap$Node类来存储其元素:

// from the Java source code for HashMap
/**
* Basic hash bin node, used for most entries. (See below for
* TreeNode subclass, and in LinkedHashMap for its Entry subclass.)
*/
// Inner class of HashMap - inner classes are always named like OuterClass$InnerClass in bytecode
static class Node<K,V> implements Map.Entry<K,V> { ... }

请记住,因为 Java 中的所有类最终都派生自 Object ,所以当您迭代 HashSet 时像这样...

for (Object obj : objects){
if(obj instanceof ObjectA){
// print that the object is A
}
}

... Object obj字面上可能是任何东西。 Java 显然找到第一个匹配 Object它可以找到并决定内部 HashMap$Node存储元素的类将适合 Object 的匹配(因为它是)。然后它继续迭代并给你 HashMap$Node的而不是您想要的实际值。 可能就是您的 ClassCastException 的原因- 你有HashMap$Node而不是 Objects你想要的。

解决方案

既然所有对象都源自,那么 Object ,告诉 Java 您想要实际值的唯一方法是使用老式的 Iterator<E>方法前天增强-for (这将取代当前的 for 循环):

Iterator<Object> iter = objects.iterator();
Object obj;
while (iter.hasNext()) {
obj = iter.next();
if (obj instanceof ObjectA) {
// ... do stuff ...
}
}

这应该像你想要的那样工作,因为它保证只给你你的值,因为它在 HashSet 中是这样实现的:

// from the Java source code for HashSet
public Iterator<E> iterator() {
return map.keySet().iterator(); // only get the keys from the underlying HashMap, i.e. the values.
}

关于Java HashSet 中的动态对象存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27749777/

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