簡體   English   中英

在 Comparable 接口中覆蓋 compareTo() 的問題

[英]Problems with overriding compareTo() in interface Comparable

我正在開發一個程序,該程序必須覆蓋 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 的新手,因此如果有人發現問題,如果您也能解釋我做錯了什么(或遺漏了什么),我將不勝感激。

謝謝:)

這是因為您已經參數化了Comparable (類型參數是Assistant )。 應該這樣做(我已經簡化了一點):

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

由於您正在實施 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

改變

public int compareTo(Object o2)

到,

public int compareTo(Assistant o2)

對於已經正確說明如何編譯實現的示例,我將添加一些規則供您記住有關覆蓋方法的規則:

  1. 要覆蓋方法,您需要使用相同的方法名稱,
  2. 協變(向后兼容)返回類型,
  3. 相同或更廣泛的訪問類型,但不會更窄。
  4. 但是參數列表必須不同。

數字 4 解釋了為什么需要將參數類型從 Object 更改為 Assistant 以使其成功覆蓋 compareTo() 方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM