2014-01-10 5 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 'является признаком запаха кода. Подумайте о наличии «перечисления» типов сотрудников и переключателя case в перечислении. Класс 'Staff' может иметь метод« abstract », который заставляет любую реализацию возвращать свой тип. Еще лучшим решением будет шаблон посетителя. –

+0

Спасибо, я уже несколько раз читал о злоупотреблении instanceof и о том, что это плохой запах кода, поэтому он будет стремиться избегать в будущих проектах и ​​рефакторе, как вы предлагаете. – gazrolo4

ответ

6

Вы используете сырьевое Iterator. Либо вам нужно бросить на StaffObject, возвращенный it.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

Смежные вопросы