1

我有一个public Set<ProjectItem> projectItems = new HashSet<ProjectItem>();可以包含两种类型的类(ProjectItem它们都是抽象超类)。类是DeliverableTask。我想DeliverableSet. 因此我写这个:

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 查询中有什么错误吗?

感谢您的每一个帮助。

4

3 回答 3

4

你的代码有点过时了。尝试:

for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()){
    ProjectItem item = iter.next();
    if (item.getClass() == Deliverable.class){
        result.add((Deliverable)item);
    }
}
于 2013-05-31T18:36:32.203 回答
3

问题是循环内的多次调用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()与上述问题无关,但也不应该存在。因为您将跳过实际的当前元素。

于 2013-05-31T18:34:56.150 回答
2

你打iter.next()了两次电话——一次是在支票上,一次是在取回时。看来您发现 aDeliverable后跟Task. 检查Deliverable成功,但迭代器在此Task之后立即移动,因此以下调用next返回 a Task,而不是 a 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);
    }
}
于 2013-05-31T18:36:40.540 回答