简体   繁体   English

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

[英]Get specific class objects from HashSet in Java

I have a public Set<ProjectItem> projectItems = new HashSet<ProjectItem>(); 我有一个public Set<ProjectItem> projectItems = new HashSet<ProjectItem>(); which can contains two types of classes ( ProjectItem is a abstract super class for both of them). 它可以包含两种类型的类( ProjectItem是它们两者的抽象超类)。 The classes are Deliverable and Task . 这些类是DeliverableTask I want get all objects of the class Deliverable from the Set . 我想从Set获取类Deliverable所有对象。 Therefore I write this: 因此,我这样写:

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;
}

But this makes an exception - 但这是一个例外-

Exception in thread "main" java.lang.ClassCastException: edu.Chryb.ProjectManagement.Task cannot be cast to edu.Chryb.ProjectManagement.Deliverable 线程“主”中的异常java.lang.ClassCastException:edu.Chryb.ProjectManagement.Task无法强制转换为edu.Chryb.ProjectManagement.Deliverable

in the Line with: Deliverable del = (Deliverable) iter.next(); 在以下行中: Deliverable del = (Deliverable) iter.next();

Is something in the if query wrong? if查询中是否有错误?

Thanks for every help. 多谢您的协助。

Your code is a bit out. 您的代码有点不足。 Try: 尝试:

for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()){
    ProjectItem item = iter.next();
    if (item.getClass() == Deliverable.class){
        result.add((Deliverable)item);
    }
}

The problem is the multiple invocations of iter.next() (because it return current element and forwards the cursor to the next element) within the loop. 问题是循环内iter.next()的多次调用(因为它返回当前元素并将光标转发到下一个元素)。

Within the loop do something as follows first - 在循环中首先执行以下操作-

for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext();){
    ProjectItem currItem = iter.next();
    //...

And then use currItem instead of calling iter.next() multiple times. 然后使用currItem而不是多次调用iter.next()


Side Note: 边注:

for(Iterator<ProjectItem> iter = projectItems.iterator(); iter.hasNext(); iter.next()) {

The call iter.next() doesn't have to do with the mentioned problem but it shouldn't be there also. 调用iter.next()不必与提到的问题有关,但也不应该在那里。 Because that you will skip actual current element. 因为那样您将跳过实际的当前元素。

You are calling iter.next() twice - once in the check, and once on the retrieval. 您两次调用iter.next() -一次检查,一次检索。 It appears that you find a Deliverable followed by Task . 看来您找到了“可Deliverable和“ Task The check of Deliverable succeeds, but the iterator moves on to Task right after that, so the following invocation of next returns a Task , not a Deliverable . Deliverable的检查成功,但是迭代器随后立即移至Task ,因此以下对next调用返回Task ,而不是Deliverable

Change your code as follows: 更改您的代码,如下所示:

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