【问题标题】:Problems with overriding compareTo() in interface Comparable在接口 Comparable 中覆盖 compareTo() 的问题
【发布时间】:2019-04-18 10:42:09
【问题描述】:

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

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

public class Assistant{

public class Assistant implements Comparable<Assistant>{

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

首先,在同一行

public class Assistant implements Comparable<Assistant>{

它告诉我“它不是抽象的,并且不会覆盖 Comparable 中的 compareTo(Assistant)。”当我转到我创建的 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(Object) 和 Assistant 中的 compareTo(Assistant) 具有相同的擦除,但都不会覆盖另一个。”

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

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

谢谢你:)

【问题讨论】:

    标签: java oop if-statement comparator comparable


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这是因为有 Assistant 类型的 Comparable

        改变

        public int compareTo(Object o2)
        

        到,

        public int compareTo(Assistant o2)
        

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-01
            • 2012-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多