簡體   English   中英

處理 Java 泛型錯誤

[英]Dealing with a Java generics bug

我在以下代碼中有一些泛型:

public <T extends Comparable<T>> int insertionSort(T[] a) {
   // throw new RuntimeException("not implemented");
      final int L = a.length;
      int compares = 0;
      
      for(int i = 1; i < L; i++){
          for(int j = i; j > 0 && a[j].compareTo(a[j - 1]) < 0; j--){
              
              Comparable tmp = a[j];   // PROBLEM HERE
              a[j] = a[j - 1];
              a[j - 1] = tmp;       // PROBLEM HERE
              
              compares++;
          }
      }
      
    return compares;
  }

// PROBLEM HERE - 代碼中的這兩行有錯誤。

錯誤是我無法完成任務。

a[j]T ,而不是Comparable

您只能將其放入T類型的變量中。

你的問題是Comparable是一個接口,而不是一個類。 您需要創建一個實現Comparable的類的 Object 。

如果T實現Comparable ,那么您可以將 tmp 聲明為T並使用它:

 T tmp = a[j];
 a[j] = a[j - 1];
 a[j - 1] = tmp;

而不是 Comparable tmp,使用 T tmp,我認為應該可以解決它。

代碼中需要注意的事項:

  • 您對 T 的定義是遞歸的。 如果需要,可能會制定一個接口。
  • 正如編譯器明確指出的那樣,您的分配是錯誤的! :-)

    可比 tmp = a[j];

這會奏效,因為這是正確的。 由於 T 擴展了 Comparable,T是一個Comparable。

  a[j - 1] = tmp;

這將不起作用,因為您正在嘗試將超類實例分配給子類實例。 Comparable 不保證有 T 行為。 因此錯誤。

您可以嘗試參數化此函數所在的類。 使用該參數來定義 T。同樣,您可能需要使用接口。 除非我們更多地了解其他相關的設計目標,否則很難提出建議。 代碼明智,錯誤是正確和合理的。

暫無
暫無

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

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