如何比较Java中的类和继承的类

Pet*_*ter 4 java sorting compare

我有两个类 - Task(实现Comparable)和DeadlinedTask(DeadlinedTask扩展Task).对于他们每个人,我编写了一个重载的compareTo函数(每个函数都有compareTo(Task)和compareTo(DeadlinedTask)).

我的想法是,我可以按类别排序常规任务,截止日期前截止DeadlinedTasks,但我也希望所有DeadlinedTasks都排在任务之上.

当我在一系列任务(没有DeadlinedTasks)的列表上调用Collections.sort(myListOfTasks)时,一切都像魅力一样.但是,当我有一个Tasks和DeadlinedTasks的列表时,对象会改变顺序,但它们没有完全排序.

我已经尝试在interclass比较中返回1以外的数字(1,1000,1000000都做了同样的事情).有没有办法通过compareTo和Collections.sort来做到这一点,我可以使用不同的java功能,还是我必须编写自己的搜索功能(作为比较器?)?

任务比较方法:

public int compareTo(Task other){
    if(this.GetCategory().compareTo(other.GetCategory())==0)
        return this.GetName().compareTo(other.GetName());
    else 
        return this.GetCategory().compareTo(other.GetCategory());
}
public int compareTo(DeadlinedTask other){
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

DeadlinedTask compareTo方法:

public int compareTo(Task other){
    return -1;
}
public int compareTo(DeadlinedTask other){
    if(this.GetDeadline().compareTo(other.GetDeadline())==0)
        return this.GetName().compareTo(other.GetName());
    else 
        return this.GetDeadline().compareTo(other.GetDeadline());
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

Ste*_*n C 5

...或者我是否必须编写自己的搜索功能(作为比较器?)?

是.我认为这是最好的方式.

如果参数实际类型与实际类型不匹配equals,compareTo则处理的常规方法是返回false(for equals)或throw ClassCastException(for compareTo)this.

如果您尝试实现equalscompareTo子类型,您可以轻松创建语义异常,例如:

  • a.equals(b)b.equals(a)返回不同的值,或
  • a.compareTo(b)b.compareTo(a)返回不一致的值.

避免这些异常将需要使超类型知道该子类型.从设计角度来看,这是一个糟糕的因素,因为它限制了您将来创建更多子类型的能力.

对于需要实现订购两个或更多不同类的实例的规则的用例,a Comparator是最佳解决方案.