2017-06-13 50 views
2

我們正在將現有代碼從Java 1.5遷移到Java 8,並且在使用-Xlint進行編譯時遇到了類似「未經檢查的調用compare(T,T)作爲原始類型Comparator的成員「。作爲原始類型成員比較(T,T)的未經檢查的調用Comparator

我大致瞭解,我需要以某種方式告訴我將傳遞給Comparator哪種數據類型,但我使用泛型,因此我可以傳入不同的數據類型,所以如何消除此警告。

這裏是我的代碼片段在那裏我看到這樣的警告:

private static void mergeSort(Object[] source, int[] src,int[] dest, 
             int low, int high, int off, Comparator c) { 
     int length = high - low; 

     for (int i=low; i<high; i++) 
       for (int j=i; j>low && c.compare(source[dest[j-1]], source[dest[j]])>0; j--) { 
        int t = dest[j]; 
        dest[j] = dest[j-1]; 
        dest[j-1] = t; 
       } 
      return; 
} 

而且,這是被稱爲:

public void setSort(Comparator<T> comparator) { 
List<T> currentList = getCurrentList(); 

     int[] dst = new int[currentList.size()]; 
     for (int i=0; i< currentList.size(); i++) 
      dst[i]=i; 
     int [] src = dst.clone(); 
     mergeSort (currentList.toArray(), src, dst,0, dst.length, 0, comparator); 
} 

既然我已經在setSort()法說Comparator<T> comparator ,爲什麼我仍然得到下面的錯誤?

warning: [unchecked] unchecked call to compare(T,T) as a member of the 
raw type Comparator [multiant]    for (int j=i; j>low && 
c.compare(source[dest[j-1]], source[dest[j]])>0; j--) { 
+0

這麼多的問題。 (爲你的'比較器'添加一個類型參數。) –

回答

2

據我所知,你必須改變的mergeSort定義:

public static <T> void mergeSort(Object[] source, int[] src, int[] dest, 
     int low, int high, int off, Comparator<T> c) { 

而且比你所要做的鑄造:

@SuppressWarnings("unchecked") 
T[] sourceC = (T[]) source; 

您知道該數組的鍵入T但您不能聲明通用數組。但沒關係,因爲T將在運行時被擦除到Object

而且在for循環稍微更改爲使用:可以簡單地通過不使用原始類型來避免

for (int j = i; j > low && c.compare(sourceC[dest[j - 1]], sourceC[dest[j]]) > 0; j--) 
+0

非常感謝。這幫助我清除了我所看到的警告。 – user3723491

+0

您可以*聲明一個通用數組類型。你不能創建一個。例如參見'' void Arrays.sort(T [],Comparator )'](http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-T :A-java.util.Comparator-)。 – Radiodef

+0

@Radiodef啊是的!謝謝... – Eugene

0

什麼你得到一個警告:它只是告訴你,你在做什麼,如果你通過它壞的數據類型有可能造成對你的問題的可能性。這並不意味着你不能編譯和運行你的程序,但它告訴你,你有可能通過發送Comparator.compare()函數無法處理的東西來破壞程序。如果您想要真正移除此警告,請考慮查找您傳遞的對象是否繼承了接口或父類,並將Comparator和對象數組作爲參數類型進行參數化。

相關問題