【发布时间】:2021-01-06 05:44:42
【问题描述】:
我想使用HashSet 来存储一些对象:
public class StoredObject{
Type type; //Type is an enum
//other fields
Type getType(){return type;}
}
现在,我只想存储同一个Type 中的一个StoredObject,所以我在HashSet 的子类中覆盖contains():
public MySet<E extends StoredObject> extends java.util.HashSet<E>{
@Override
public boolean contains(Object o) {
if(StoredObject.class.isAssignableFrom(o.getClass())) {//if o implements StoredObject
for(StoredObject s : this) {
if(s.getType() == ((StoredObject) o).getType()) return true;
}
}
return false
}
}
在此之前我想使用HashSet 并修改StoredObject 的equals()。但是,上面的方法似乎是一种更短更安全的方法,尤其是在我的例子中,存储的对象都实现了一个接口并且不扩展同一个类。
现在我的问题是:这个实现安全吗?我试图寻找它可能会破坏的东西,但没有找到任何东西。我读到覆盖equals() 会破坏集合。
另外,这个子类是否违背了HashSet 的目的,因为它不使用HashMap 来代替contains()?
【问题讨论】:
-
“这个子类是否违背了 HashSet 的目的”?——是的。如果需要,您可以编写自己的单独集合实现。
-
不要创建 HashSet 的子类,而是覆盖 StoredObject 类上的 equals 和 hashcode 以使用 Type。
标签: java overriding contains hashset