私はそれを実装する2つのクラス(たとえばアシスタントとマネージャー)を持つインターフェイス(たとえば従業員)を持っています。また、最初のインターフェイスタイプのリストを返すメソッドを持つインターフェイスもあります(たとえば、Listを返すEmployeeLogicインターフェイス。このインターフェイスを実装する2つのクラス(たとえば、AssistantLogicとManagerLogic)があります。これら2つのクラスでは、Listにはアシスタントのみが含まれます。 (AssitantLogic内)およびManagerのみ(ManagerLogic内)。
問題は、サブクラスにのみ存在するメソッドに基づいて、これら2つのリストを並べ替えたいということです。このようなコンパレータを作成するにはどうすればよいですか?
おそらく、コードはより理解しやすいでしょう:
public interface Employee {
public int employeeMethod();
}
public class Manager implements Employee {
public int employeeMehod(){//[...]}
public int managerMethod(){//[...]}
}
public class Assistant implements Employee {
public int employeeMehod(){//[...]}
public String assistantMehod(){//[...]}
}
public interface EmployeeLogic() {
public List<Employee> getEmployees();
}
public class ManagerLogic implements EmployeeLogic {
public List<Employee> getEmployees() {
List<Employee> employees = [...] //or List<? extends Employee> ?
[...]
Collections.sort(employees, new Comparator<Manager>() {
@Override
public int compare(Manager o1, Manager o2) {
return o1.managerMethod().compareTo(o2.managerMethod());
}
});
return employees;
}
}
public class AssistantLogic implements EmployeeLogic {
public List<Employee> getEmployees() {
List<Employee> employees = [...] //or List<? extends Employee> ?
[...]
Collections.sort(employees, new Comparator<Assistant>() {
@Override
public int compare(Assistant o1, Assistant o2) {
return o1.assistantMehod().compareTo(o2.assistantMehod());
}
});
return employees;
}
}
そのようなコンパレータを書く方法はありますか?
私は回避策を知っていますが(以下を参照)、上記のことは1つのリストだけで可能ですか?
public class ManagerLogic implements EmployeeLogic {
public List<Employee> getEmployees() {
List<Manager> managers = new ArrayList<Manager>()
[...]
Collections.sort(managers, new Comparator<Manager>() {
@Override
public int compare(Manager o1, Manager o2) {
return o1.managerMethod().compareTo(o2.managerMethod());
}
});
List<Employee> employees = new ArrayList<Employee>();
employees.addAll(managers);
return employees;
}
}