我有一个接口(比如Employee),它有两个实现它的类(比如Assistant和Manager)。我还有一个接口,它有一个方法返回第一个接口类型的列表(比如说EmployeeLogic接口返回List。有两个类实现这个接口(比如AssistantLogic和ManagerLogic)。在这两个类中,List只包含助手(在AssitantLogic中)和唯一的Manager(在ManagerLogic中)。
问题是我想根据仅存在于子类中的方法对这两个列表进行排序。我该如何编写这样的比较器?
代码可能更容易理解:
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;
}
}
有没有办法编写这样的比较器?
我知道一种解决方法(参见下文),但只有一个列表才能实现上述目标吗?
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;
}
}
答案 0 :(得分:1)
如果我理解正确,那么问题不在于尝试对Assistant
和Manager
的混合进行排序,而在于您只能对{{{{{{ 1}}或Assistant
的列表,但您想返回Manager
的列表。
在这种情况下,您可以做的一件事是让Employee
返回getEmployees()
。
如果这不是一个选项,并且如果您不打算修改返回的列表,则可以执行List<? extends Employee>
。
如果您打算将返回的列表修改,那么您的解决方案是最简洁的方法。