2 compareTo方法在同一个类定义中重写,我怎么强制使用第二个?

时间:2010-12-22 13:45:35

标签: java list sorting collections

我想按照其中一个字段的标准对列表List<Blabla> donnees进行排序。我的问题是compareTo已被覆盖此类。所以我有类似的东西:

Blabla {

    public int compareTo(Object other) {
        ...
     }

    public int compareTo(Blabla other) {
        ... 
     }

}

在业务层类中,我调用:

Business {
   method (){
       Collections.sort(List<Blabla > donnees);
   }

}

但是这个方法用对象参数调用N°1 compareTo方法。我怎样才能用N°2方法对列表进行排序?

这是一个古老而庞大的应用程序,我不知道在N°1compareTo方法中更改任何内容的副作用,这就是为什么我想添加另一个compareTo(或其他任何)方法而不是更改第一个方法。

3 个答案:

答案 0 :(得分:4)

使用比较器代替可比较

它会让你使用你想要比较的不同方式

答案 1 :(得分:0)

我相信关于为什么最终调用compareTo(Object)方法而不是特定方法的问题的答案是因为您的类定义显示implements Comparable(没有任何类型参数)。如果没有任何通用类型,T等任何类型都将默认为Object

这有几个解决方案。第一个已经被其他人推荐,它涉及制作您自己的自定义Comparator<Blabla>对象并使用排序方法中的对象。因为这些比较器是单独的对象,所以它们不会干扰现有的类行为。例如,在具有PersongetName()方法的某个班级getAge()上使用这些比较器。您可以根据需要创建尽可能多的这些内容。

public class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
    }
}

public class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

在您开始工作之后,您可以决定是否要更改原始类,以便正确实现Comparable<Blabla>。此时,您完全删除compareTo(Object)方法并保留另一个方法。当您编译或在IDE中保存时,您将发现没有类型的那个对象被引用为Comparable的所有位置,并且它们将显示为编译器警告或错误。然后由您决定如何在每种情况下修复代码。这在很大程度上取决于compareTo(Object)方法与compareTo(Blabla)方法的不同之处。如果它明确执行instanceof检查和/或直接转换为Blabla类型,则转换应该是100%安全的,因为这意味着如果您从未遇到任何{{},则所有现有代码必须正确使用它1}}在运行时。

答案 2 :(得分:-1)

CompareTo(Object other)中的

有一个if语句

`if(other instanceof Blabla) Return compareTo((Blabla)other)`