比较器可以比较两种不同类型的对象吗?

时间:2012-09-13 20:29:32

标签: java comparator

我有两个Person和Employee类对象。 这两个类都有共同的属性年龄。 我已经将两个这两个类的对象添加到Arraylist中,现在我想要两个写一个Comparator并将它传递给Collections类的sort方法。 并希望列表根据年龄进行排序。 我这样做只是为了更清楚地了解在Java中使用Comparable和Comparator。

编辑: 原因为什么我问这个问题是我不清楚比较器和可比较的。 我在某处读到如果Class实现了Comparable,那么它就无法与其他类的对象进行比较(因为类转换异常)。

现在如果我在Employee和Person中创建关系,那么就不需要实现Comparator(除非我想根据名称或这些类的其他公共属性进行排序)。

再一次,我已经问过这个问题,以便更清楚地了解Comparator和Comparable。

到目前为止,我能够理解的是,如果我想对多个参数进行排序,那么我应该实现Comparator并将其传递给Collections.srot()。

或者如果我无法控制正在排序的对象类,那么自定义排序我应该实现Comparator。 (纠正我,如果我错了或者我错过了什么)

修改

我想现在我理解Comparable和Comparator的使用。 为了确保我得到了正确的概念,这就是我所理解的: 如果我想比较不同类的两个对象(并且没有关系),那么我应该使用原始比较器并覆盖比较方法。 有人实现Comparator而不是Comparable的另一个原因是 具有分类灵活性。 我从自然排序中理解的是在CompareTo方法中由Class实现的逻辑。

希望我对所有这些观点都是正确的。

3 个答案:

答案 0 :(得分:4)

您可以定义名为Ageable的接口,而Employee和Person可以实现此接口。您还可以定义一个抽象类(而Employee和Person将从抽象类继承)具有相同的效果。请注意,出于这个原因你也可以使用普通类,你可以做任何你需要的事情。

此外,如果没有理由说员工不是一个人(例如机器人在办公室工作),那么员工可以从人员继承。

答案 1 :(得分:3)

我会让员工成为Person的子类。 (假设您的所有员工都是人员)然后您可以创建Comparator<Person>

答案 2 :(得分:2)

您应该创建一个界面AgeProvider

public interface AgeProvider {
    int getAge();
}

PersonEmployee都应该实现AgeProvider。现在,您可以实现比较2 AgeProvider

的比较器