在 Comparable 接口中覆盖 compareTo() 的问题

Problems with overriding compareTo() in interface Comparable

我正在开发一个程序,它必须覆盖 Comparable 中的 CompareTo() 才能使 Collections.sort() 工作。因为我正在使用由助手组成的 ArrayList,所以我必须根据名称对其进行排序。

我浏览了论坛,发现并尝试更改

public class Assistant{

public class Assistant implements Comparable<Assistant>{

在 return 中允许我在另一个 class 中使用 Collections.sort() 并且不会警告我任何错误,但是,出现了两个新错误。

首先,在同一行中

public class Assistant implements Comparable<Assistant>{

它告诉我 "it is not abstract and does not override compareTo(Assistant) in Comparable." 当我转到我创建的 compareTo() 时:


    @Override
    public int compareTo(Object o2){
        Assistant m2 = (Assistant) o2;

        if(this.name.compareTo(m2.name) == 0){
            return 0;
        }else if(this.name.compareTo(m2.name)<0){
            return -1;
        }else{
            return 1;
        }
    }


(小助手的构造器只有名字)。

但是,在这个地方我在@Override 中有一个错误: "method does not override or implement a method from a supertype"。

并在下一行

    public int compareTo(Object o2){

我收到另一个错误(与上一个相关)告诉我: "Name clash: compareTo(Object) in Assistant and compareTo(Assistant) in Assistant have the same erasure, yet neither overrides the other."

我有点理解这个问题,我没有覆盖原来的 compareTo()。

我是 java 的新手,因此如果有人发现问题,请您也能解释我做错了什么(或遗漏了什么),我将不胜感激。

谢谢:)

由于您正在实施 Comparable,因此您的 compareTo() 方法需要一个 Assistent 类型的参数。

所以使用这个应该可行:

@Override
public int compareTo(Assistent m2) {

    if(this.name.compareTo(m2.name) == 0){
        return 0;
    }else if(this.name.compareTo(m2.name)<0){
        return -1;
    }else{
        return 1;
    }
}

因为你参数化了Comparable(类型参数是Assistant)。应该这样做(我稍微简化了一下):

@Override
public int compareTo(Assistant o){
    return this.name.compareTo(o.name);
}

这是因为有 Assistant

类型的 Comparable

改变

public int compareTo(Object o2)

给,

public int compareTo(Assistant o2)

对于已经正确说明了如何编译实现的示例,我将添加一些规则以供您记住有关覆盖方法的规则:

  1. 要覆盖您需要使用相同方法名称的方法,
  2. 协变(向后兼容)return 类型,
  3. 相同或更广泛的访问类型,但不更窄。
  4. 但是参数列表必须不同。

第 4 条解释了为什么需要将参数类型从 Object 更改为 Assistant 以使其成功覆盖 compareTo() 方法。