Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在树映射上迭代-不兼容类型_Java_Iterator_Iteration_Treemap - Fatal编程技术网

Java在树映射上迭代-不兼容类型

Java在树映射上迭代-不兼容类型,java,iterator,iteration,treemap,Java,Iterator,Iteration,Treemap,我有以下收藏: private Map <String, Staff> staff; 应该将它们返回存储在staffMember变量中,据我所知,这很好??非常感谢你的帮助 Collection <Staff> staffList = staff.values(); Iterator it = staffList.iterator (); while ((isJobAssigned = false) ||it.hasNext())

我有以下收藏:

private Map <String, Staff> staff;
应该将它们返回存储在staffMember变量中,据我所知,这很好??非常感谢你的帮助

Collection <Staff> staffList = staff.values(); 
         Iterator it = staffList.iterator ();
         while ((isJobAssigned = false) ||it.hasNext())
         {
             Staff staffMember = it.next(); 
             if ((staffMember instanceof Typist) && (jobType.equalsIgnoreCase("Typist")))
             {
                 newJob.setJobState ("Assigned");
                 staffMember.setState("Working");
                 return newJon.getJobNo() + " Staff allocated: " + staffMember.getName () + ", ID: " + staffMember.getId();
                }
Collection statfflist=staff.values();
迭代器it=staffList.Iterator();
而((isJobAssigned=false)| it.hasNext()
{
staffMember=it.next();
if((打字员的staffMember实例)和&(jobType.equalsIgnoreCase(“打字员”))
{
newJob.setJobState(“已分配”);
员工状态(“工作”);
返回newJon.getJobNo()+“分配的员工:”+staffMember.getName()+”,ID:“+staffMember.getId()”;
}

您使用的是原始的
迭代器
。您需要将
对象
转换为
it.next()
返回的
人员
,或者使用通用的
迭代器

使用原始迭代器:

Staff staffMember = (Staff)it.next(); 
使用通用迭代器(我建议使用此版本):

Iterator it=staffList.Iterator();
Staff staffMember=it.next();//您可以保留这个
您为什么不使用:

for (Staff st : staff.values()){
 // do your stuff
 if(st instanceof Typist) break;   
}

如果可以指定类型,请不要使用原始迭代器。请确保类型安全。+1谢谢,我实现了您推荐的解决方案,它工作得非常好。我将对泛型进行一些研究,以确保我完全理解。再次感谢。虽然它不能回答问题,但它肯定是一个更好的解决方案。我希望在达到fir时停止迭代与工作类型相匹配的st员工,所以我认为使用while循环会更好?为什么不中断?我编辑了我的答案,其中的一个条件是复制自您的问题,但这里的一般要点是使用中断来退出循环。因为我是一个新手:-)这是一个很好的观点,现在您已经解释过了。我只是坚持硬和快Orth=对整个集合进行迭代,而不是无限迭代。这是一个整洁的技术,当然也会整理这个代码。使用<代码>实例> <代码>是一个代码的气味。考虑有一个工作人员类型的<代码> EnUM <代码>和一个在EnUM上的案例切换。<代码>职员<代码>类可以有一个<代码>抽象方法,强制任何实现返回其类型。更好的解决方案是访问者模式。谢谢,我现在已经读了几遍有关instanceof滥用的内容,以及instanceof是一种糟糕的代码味道这一事实,因此我将在未来的项目中避免它,并按照您的建议进行重构。
Staff staffMember = (Staff)it.next(); 
Iterator<Staff> it = staffList.iterator();
Staff staffMember = it.next();  //you can keep this
for (Staff st : staff.values()){
 // do your stuff
 if(st instanceof Typist) break;   
}