2014-01-10 23 views
3

我有以下的集合:的Java迭代一個TreeMap - 不兼容的類型

private Map <String, Staff> staff; 

實現爲一個TreeMap:

staff = new TreeMap <String, Staff>(); 

我需要遍歷在這個地圖中的值,但是當我嘗試下面的代碼我得到一個不兼容的類型編譯錯誤。我無法理解這是爲什麼;在我的地圖中值是工作人員對象和

it.HasNext() 

應該返回它們存儲在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(); 
       } 
+0

使用'的instanceof '是一種代碼味道的標誌。考慮在枚舉上使用enum職員類型和一個case開關。 'Staff'類可以有一個'abstract'方法,強制任何實現返回它的類型。更好的解決方案是訪客模式。 –

+0

謝謝,我已經閱讀了幾次有關濫用instanceof和它是一種不好的代碼氣味的事實,所以我們將在未來的項目中進行重構,並按照您的建議進行重構。 – gazrolo4

回答

6

您正在使用原始Iterator。要麼你需要投到StaffObjectit.next()返回或使用通用Iterator

使用原始的迭代器:

Staff staffMember = (Staff)it.next(); 

使用通用的迭代(我推薦這個版本):

Iterator<Staff> it = staffList.iterator(); 
Staff staffMember = it.next(); //you can keep this 
+2

如果可以指定類型,則不要使用原始迭代器。 +1 –

+0

謝謝,我實施了你推薦的解決方案,它的工作原理非常完美。我會做一些關於泛型的研究,以確保我完全理解這一點。再次感謝。 – gazrolo4

3

你爲什麼不使用:

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

儘管它沒有回答這個問題,但它絕對是一個更好的解決方案。 –

+0

當我們到達與工作類型相匹配的第一個員工時,我想停止迭代,所以我認爲一個while循環會更好地做到這一點? – gazrolo4

+0

爲什麼不休息?我編輯了我的答案,並附帶了一個複製的條件,但這裏的一般要點是使用break來退出循環。 – elbuild