Java 2比较同一类定义中重写的方法,如何强制使用第二个?
我想根据一个字段上的条件对列表进行排序。我的问题是这个类已经重写了compareTo。所以我有一些类似的东西: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
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
检查和/或直接转换为typeBlabla
,那么转换应该是100%安全的,因为这意味着如果您在运行时从未遇到任何ClassCastException
,那么所有现有代码都必须正确使用它。这是在一个旧的大型应用程序上,我不知道更改N°1 compareTo方法中的任何内容会产生什么副作用,这就是为什么我想添加另一个compareTo(或任何其他)方法,而不是更改第一个方法。+1:在这种情况下,使用compareTo是唯一正确的方法。这里有一个潜在的有用链接,当您将BlaBla对象作为参数传递给compareto方法时,它将调用您的实现方法,而任何其他对象在传递时都将调用重写方法。-1:这种方法打破了Liskov原则()。