Java: 将文件中的对象读入不同的派生 类

Java: reading objects from file into different derived classes

我有 class 名员工,以及两个派生的 classes 小时工和薪水。那些派生的 classes 的实例化被放置在同一个名为 employeeList 的数组列表中。当我使用 ois.readObject() 从文件中读取这些对象时,如何确保数据最终出现在适当的派生 class 中?谢谢!

我假设它们是 Employee class 的扩展?如果你有这样的数组:

List<Employee> emps = ...

然后你可以这样做:

for (Employee e : emps) { if (e instanceof Hourly) ... }

你还需要检查元素。您也可以像这样使用过滤器:

emps.stream().filter(e -> e instanceof Hourly).collect(Collectors.toList())

注意:我不熟悉 ObjectInputStream,所以我不确定这个动态调度在这里是否有效,但我建议尝试一下:

您可以让您的员工界面看起来像这样:

interface Employee {
    // Whatever other methods you have defined
    
    void populateFieldsFromObject(Object obj);
}

那么每个子类都会以不同的方式实现这个方法:

class HourlyEmployee implements Employee {

    // Other methods/fields...

    @override
    void populateFieldsFromObject(Object obj) {
        if (!(obj instanceof HourlyEmployee)) {
            throw new IllegalArugmentException("Object not of correct type");
        }
        HourlyEmployee objEmp = (HourlyEmployee)Object;
        this.hourly = objEmp.hourly;
    }
}

class SalaryEmployee implements Employee {

    // Other methods/fields...

    @override
    void populateFieldsFromObject(Object obj) {
        if (!(obj instanceof SalaryEmployee)) {
            throw new IllegalArugmentException("Object not of correct type");
        }
        SalaryEmployee objEmp = (SalaryEmployee)Object;
        this.salary = objEmp.salary;
    }
}

然后您可以遍历您的员工列表,然后调用: employee.populateFieldsFromObject(ois.readObject());,因为 Dynamic Dispatch 应该根据对象的类型自动确定调用哪个方法。

让我知道这是否有效。