#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);