2017-06-13 4 views
2

Nous migrons notre code existant de Java 1.5 vers Java 8, et en compilant avec -Xlint, je suis tombé sur des avertissements comme "appel non contrôlé à compare(T,T) en tant que membre du type brut Comparator ". Je comprends à peu près que je dois dire en quelque sorte quel type de données je passerais à Comparator, mais j'utilise des génériques pour pouvoir transmettre différents types de données, alors comment puis-je éliminer cet avertissement.Appel non coché pour comparer (T, T) en tant que membre du type brut Comparateur

Voici un extrait de mon code où je vois cet avertissement:

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; 
} 

Et, cela est appelé:

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); 
} 

Depuis que je suis déjà dit dans Comparator<T> comparatorsetSort() méthode , pourquoi je reçois toujours l'erreur ci-dessous?

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

Tant de problèmes peuvent être évités simplement ne pas utiliser les types bruts. (Ajoutez un paramètre de type à votre 'Comparateur'.) –

Répondre

2

Pour autant que je peux dire, vous devez changer la définition de mergeSort:

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

Et que vous avez à faire un casting:

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

Vous savez que le tableau est de tapez T mais vous ne pouvez pas déclarer un tableau générique. Mais ça va, puisque T va être effacé à Object à l'exécution de toute façon.

Et la boucle for change légèrement à l'utiliser:

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

Merci beaucoup. Cela m'a aidé à effacer l'avertissement que je voyais. – user3723491

+0

Vous pouvez * déclarer * un type de tableau générique. Vous ne pouvez pas en créer un. Voir par exemple [' void Arrays.sort (T [], Comparateur )'] (http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#sort-T : A-java.util.Comparator-). – Radiodef

+0

@Radiodef ah oui! Je vous remercie... – Eugene

0

Qu'est-ce que vous obtenez est un avertissement: il vous dit simplement que ce que vous faites est susceptible de vous causer des problèmes si vous passez mauvais types de données. Cela ne signifie pas que vous ne pouvez pas compiler et exécuter votre programme, mais cela vous indique que vous risquez de provoquer un blocage de votre programme en envoyant un élément que la fonction Comparator.compare() ne peut pas gérer. Si vous voulez vraiment supprimer cet avertissement, pensez à déterminer si les objets que vous transmettez héritent tous d'une interface ou d'une classe parente et paramétrent le comparateur et le tableau d'objets de ce type.