[英]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
. 这些类是
Deliverable
和Task
。 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.