如何遍历这种类型的哈希表?

时间:2019-04-12 17:12:26

标签: java hashtable

我有这段代码,在这里我使用扩展来保留每个类中所有创建的对象。

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()和新的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)'

2 个答案:

答案 0 :(得分:0)

我想您正在尝试在Employee类的整个范围内调用raise()。在您提供的最后一个代码片段中,您尝试对ObjectPlus.extensions中保存的所有类的所有对象调用setSalary。

我想您需要的是:

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

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

答案 1 :(得分:0)

扩展列表元素不熟悉setSalary方法,应将其强制转换为Employee对象

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