我有 Employee 類和兩個派生類 Hourly 和 Salary。這些派生類的實體被放置在名為employeeList 的同一個陣列串列中。當我使用 ois.readObject() 從檔案中讀取這些物件時,如何確保資料最終出現在適當的派生類中?謝謝!
uj5u.com熱心網友回復:
我假設它們是 Employee 類的擴展?如果你有一個這樣的陣列:
List<Employee> emps = ...
那么你可以做這樣的事情:
for (Employee e : emps) { if (e instanceof Hourly) ... }
您仍然需要檢查元素。您還可以像這樣使用過濾器:
emps.stream().filter(e -> e instanceof Hourly).collect(Collectors.toList())
uj5u.com熱心網友回復:
注意:我不熟悉 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());,因為動態調度應該根據物件的型別自動確定要呼叫的方法。
讓我知道這個是否奏效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/354096.html
