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 应该根据对象的类型自动确定调用哪个方法。
让我知道这是否有效。
我有 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 应该根据对象的类型自动确定调用哪个方法。
让我知道这是否有效。