在接口类型列表中排序实例时如何在Java中使用比较器?

时间:2012-05-10 06:10:50

标签: java generics comparison

我有一个接口(比如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;
        }

    }

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么问题不在于尝试对AssistantManager的混合进行排序,而在于您只能对{{{{{{ 1}}或Assistant的列表,但您想返回Manager的列表。

在这种情况下,您可以做的一件事是让Employee返回getEmployees()。 如果这不是一个选项,并且如果您不打算修改返回的列表,则可以执行List<? extends Employee>。 如果您打算将返回的列表修改,那么您的解决方案是最简洁的方法。