比较器能够比较不同类型的两个对象吗?

7
我有两个类Person和Employee的对象。这两个类都有一个共同的属性age。我已经将这两个类的一些对象添加到ArrayList中,现在我想编写一个比较器并将其传递给Collections类的sort方法。并希望列表按照年龄排序。我尝试这样做只是为了更清楚地了解Java中Comparable和Comparator的用法。
编辑: 我提出这个问题的原因是我对Comparator和Comparable不太清楚。我在某个地方读到,如果一个类实现了Comparable,则不能与其他类的对象进行比较(因为会出现类转换异常)。现在,如果我在Employee和Person之间创建关系,则不需要实现Comparator(除非我想根据这些类的名称或其他公共属性进行排序)。我再次提出这个问题是为了更清楚地了解Comparator和Comparable。
到目前为止,我所能理解的是,如果我想在多个参数上进行排序,则应该实现Comparator并将其传递给Collections.sort()。或者,如果我无法控制要排序的对象的类,则应该实现自定义排序的Comparator。(如果我错了或者我漏掉了什么,请纠正我)
编辑 我现在认为我理解了Comparable和Comparator的用法。为了确保我掌握了正确的概念,这里是我理解的内容:如果我想比较两个不同类(并且没有关系)的对象,则应使用原始比较器并覆盖compare方法。另一个实现Comparator而不是Comparable的原因是具有排序的灵活性。从自然排序中我所理解的是CompareTo方法中类实现的逻辑。
希望我对所有这些观点的理解都是正确的。

8
为什么不使用接口(例如Ageable),使Person和Employee都实现它,并比较两个可比较年龄的对象? - om-nom-nom
1
@om-nom-nom 这听起来像是对这个问题的很好回答。 - Paul Bellora
如果您不使用泛型,那当然可以。 - obataku
@oldrinb 你可以使用原始的 Comparator,但是随后你需要通过反射来获取 age 属性(或者通过向下转型到未知类型来获取)。 - phlogratos
1
是的,使用反射并将性能扔到窗外。 讽刺 - om-nom-nom
显示剩余15条评论
3个回答

6

您可以定义一个名为Ageable的接口,Employee和Person可以实现这个接口。此外,您还可以定义一个抽象类(Employee和Person将从抽象类继承),具有相同的效果。请注意,您也可以使用普通类来实现此目的,可以根据需要进行操作。

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


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

1
我最好定义一个可年龄化的接口(正如其他用户所说)。子类化可能会产生不必要的副作用。 - polypiel
1
@polypiel 像对待一个人而不是员工一样,即使你并不是这个意思 ;) - Peter Lawrey

3
您需要创建一个接口AgeProvider:
public interface AgeProvider {
    int getAge();
}

需要实现AgeProvider接口的类有PersonEmployee。现在可以实现一个比较器来比较两个AgeProvider对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接