[英]Get specific class objects from HashSet in Java
我有一个public Set<ProjectItem> projectItems = new HashSet<ProjectItem>();
它可以包含两种类型的类( ProjectItem
是它们两者的抽象超类)。 这些类是Deliverable
和Task
。 我想从Set
获取类Deliverable
所有对象。 因此,我这样写:
public Set<Deliverable> allDeliverables(){
Set<Deliverable> result = new HashSet<Deliverable>();
for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()){
if (iter.next().getClass() == Deliverable.class){
Deliverable del = (Deliverable) iter.next();
result.add(del);
}
}
return result;
}
但这是一个例外-
线程“主”中的异常java.lang.ClassCastException:edu.Chryb.ProjectManagement.Task无法强制转换为edu.Chryb.ProjectManagement.Deliverable
在以下行中: Deliverable del = (Deliverable) iter.next();
if查询中是否有错误?
多谢您的协助。
您的代码有点不足。 尝试:
for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()){
ProjectItem item = iter.next();
if (item.getClass() == Deliverable.class){
result.add((Deliverable)item);
}
}
问题是循环内iter.next()
的多次调用(因为它返回当前元素并将光标转发到下一个元素)。
在循环中首先执行以下操作-
for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext();){
ProjectItem currItem = iter.next();
//...
然后使用currItem
而不是多次调用iter.next()
。
边注:
for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()) {
调用iter.next()
不必与提到的问题有关,但也不应该在那里。 因为那样您将跳过实际的当前元素。
您两次调用iter.next()
-一次检查,一次检索。 看来您找到了“可Deliverable
和“ Task
。 对Deliverable
的检查成功,但是迭代器随后立即移至Task
,因此以下对next
调用返回Task
,而不是Deliverable
。
更改您的代码,如下所示:
for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()){
ProjectItem next = iter.next();
if (next.getClass() == Deliverable.class){
Deliverable del = (Deliverable) next;
result.add(del);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.