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

问题描述 投票:2回答:4

我正在编写一个程序,它必须覆盖Comparable中的CompareTo()才能使Collections.sort()工作。因为我正在使用由Assistants组成的ArrayList,我必须根据名称进行排序。

我环顾了论坛,发现并试图改变

public class Assistant{

public class Assistant implements Comparable<Assistant>{

作为回报,它允许我在另一个类中使用Collections.sort()并且不会警告我任何错误,但是,会出现两个新错误。

首先,在同一行

public class Assistant implements Comparable<Assistant>{

它告诉我“它不是抽象的,也不会覆盖Comparable中的compareTo(助手)。”当我去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中有一个错误:“方法不会覆盖或实现超类型的方法”。

并在下一行

    public int compareTo(Object o2){

我得到另一个错误(与最后一个相关)告诉我:“名称冲突:在Assistant中的compareTo(对象)和在助手中的compareTo(助手)具有相同的擦除,但都不会覆盖另一个。”

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

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

谢谢 :)

java comparable
4个回答
5
投票

这是因为你有参数化Comparable(类型参数是Assistant)。这应该做(我已经简化了一点):

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

1
投票

由于您正在实现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;
    }
}

1
投票

这是因为具有Assistant类型的可比较

更改

public int compareTo(Object o2)

至,

public int compareTo(Assistant o2)

1
投票

对于已经正确陈述的实现将如何编译的示例,我将添加一些规则供您记住关于重写方法:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.