Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 2比较同一类定义中重写的方法,如何强制使用第二个?_Java_List_Sorting_Collections - Fatal编程技术网

Java 2比较同一类定义中重写的方法,如何强制使用第二个?

Java 2比较同一类定义中重写的方法,如何强制使用第二个?,java,list,sorting,collections,Java,List,Sorting,Collections,我想根据一个字段上的条件对列表进行排序。我的问题是这个类已经重写了compareTo。所以我有一些类似的东西: Blabla { public int compareTo(Object other) { ... } public int compareTo(Blabla other) { ... } } 在业务层类中,我调用: Business { method (){ Collections.so

我想根据一个字段上的条件对列表进行排序。我的问题是这个类已经重写了compareTo。所以我有一些类似的东西:

Blabla {

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

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

}
在业务层类中,我调用:

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

}
业务{
方法(){
集合。排序(列出对象);
}
}
但是这个调用N°1比较对象参数的方法。如何使用N°2方法对列表进行排序


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

使用比较方法,而不是比较方法

它将允许您在比较中使用各种不同的方式进行比较,以便(Object other)有一个if语句

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

我相信对于为什么最终调用
compareTo(Object)
方法而不是特定方法的问题的答案是因为类定义说
实现了Comparable
(没有任何类型参数)。如果没有任何泛型类型,任何类型(如
T
)都将默认为
Object

有几种解决方案。第一种方法已经被其他人推荐,它涉及到创建自己的自定义
比较器
对象,并在排序方法中使用这些对象。因为这些比较器是独立的对象,所以它们不会干扰现有的类行为。以这些比较器为例,在一些类
Person
上,它有
getName()
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());
    }
}
public类AgeComparator实现Comparator{
@凌驾
公共整数比较(o1人、o2人){
返回o1.getAge()-o2.getAge();
}
}
公共类NameComparator实现了Comparator{
@凌驾
公共整数比较(o1人、o2人){
返回o1.getName().compareTo(o2.getName());
}
}

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

这是在一个旧的大型应用程序上,我不知道更改N°1 compareTo方法中的任何内容会产生什么副作用,这就是为什么我想添加另一个compareTo(或任何其他)方法,而不是更改第一个方法。+1:在这种情况下,使用compareTo是唯一正确的方法。这里有一个潜在的有用链接,当您将BlaBla对象作为参数传递给compareto方法时,它将调用您的实现方法,而任何其他对象在传递时都将调用重写方法。-1:这种方法打破了Liskov原则()。