[英]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,我認為應該可以解決它。
代碼中需要注意的事項:
正如編譯器明確指出的那樣,您的分配是錯誤的! :-)
可比 tmp = a[j];
這會奏效,因為這是正確的。 由於 T 擴展了 Comparable,T是一個Comparable。
a[j - 1] = tmp;
這將不起作用,因為您正在嘗試將超類實例分配給子類實例。 Comparable 不保證有 T 行為。 因此錯誤。
您可以嘗試參數化此函數所在的類。 使用該參數來定義 T。同樣,您可能需要使用接口。 除非我們更多地了解其他相關的設計目標,否則很難提出建議。 代碼明智,錯誤是正確和合理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.