繁体   English   中英

从Java中的HashSet获取特定的类对象

[英]Get specific class objects from HashSet in Java

我有一个public Set<ProjectItem> projectItems = new HashSet<ProjectItem>(); 它可以包含两种类型的类( ProjectItem是它们两者的抽象超类)。 这些类是DeliverableTask 我想从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM