Как выполнить итерацию по этому типу хеш-таблицы?

#java #hashtable

#java #хеш-таблица

Вопрос:

У меня есть этот фрагмент кода, в котором я использую расширения для хранения всех созданных объектов из каждого класса.

 public class ObjectPlus implements Serializable{

    private static final long serialVersionUID = 1L;

    protected static Hashtable<Class<? extends ObjectPlus>, Vector<ObjectPlus>> extensions = new Hashtable<>();

    public ObjectPlus()
    {
        Vector<ObjectPlus> extension= null;
        Class<? extends ObjectPlus> clasS = this.getClass();

        if(extensions .containsKey(clasS))
        {
            extension= extensions.get(clasS);
        }
        else
        {
            extension = new Vector<ObjectPlus>();
            extensions.put(clasS, extension);
        }
        extension.add(this);
    }
  

У меня есть также 3 других класса:

 public abstract class Employee extends ObjectPlus{}
public class Guide extends Employee{}
public class Renovator extends Employee{}
  

и я добавляю каждый новый Guide () и new Renovator() в эту хеш-таблицу.

У меня также есть одна функция в классе Employee():

 public void raise(double raiseAmount){}
  

в котором я хочу использовать метод

 public void setSalary(double newSalary) {
    this.salary = newSalary;
}   
  

итак, для каждого объекта из обоих классов Guide и Renovator была установлена зарплата в новое значение.

Могу ли я выполнить правильную итерацию по этой хеш-таблице?

Я пытался использовать что-то вроде этого:

     public void raise(double raiseAmount){
    Set<Class<? extends ObjectPlus>> setOfClasses = extensions.keySet();

    for (Class<? extends ObjectPlus> key : setOfClasses){
        extensions.get(key).setSalary(raiseAmount);
    }
}
  

но это не работает: «не удается разрешить метод ‘setSalary (double)’

Комментарии:

1. Что вы хотите делать во время итерации? Вы можете просто выполнить итерацию по нему, как по любой карте.

2. Я хотел бы, чтобы каждый объект из подклассов Employee (Renovator и Guide) мог изменять свою зарплату, вызывая метод setSalary(double newSalary){ this.salary = newSalary} Это для цели представления метода класса в UML-проекте

Ответ №1:

Я полагаю, вы пытались вызвать raise() весь класс Employee. В последнем предоставленном вами фрагменте кода вы пытаетесь вызвать setSalary для всех объектов всех классов, хранящихся в ObjectPlus.extensions.

Я думаю, что вам нужно вместо этого:

 public void raise(double raiseAmount){
    List<Employee> employees = (List<Employee>)extensions.get(Employee.class);

    for (Employee emp : employees){
        emp.setSalary(raiseAmount);
    }
}
  

Комментарии:

1. С помощью List<Employee> employees = extensions.get(Employee.class ); Я получаю несовместимые типы. Если это важно, абстрактный класс Employee расширяет ObjectPlus, а Renovator и Guide расширяют класс Employee.

2. Я отредактировал свой ответ, чтобы привести результат extensions.get(Employee.class) , пожалуйста, попробуйте сейчас.

Ответ №2:

элемент списка расширений не знаком с методом setSalary, вы должны привести его к объекту Employee

((Employee)extensions.get(key)).setSalary(raiseAmount);