Existe-t-il un moyen de rendre cette méthode générique et de supprimer les avertissements?Génériques récursifs
/**
* <p>Sort a collection by a certain "value" in its entries. This value is retrieved using
* the given <code>valueFunction</code> which takes an entry as argument and returns
* its value.</p>
*
* <p>Example:</p>
* <pre>// sort tiles by number
*Collects.sortByValue(tileList, true, new Function<Integer,NormalTile>() {
* public Integer call(NormalTile t) {
* return t.getNumber();
* }
*});</pre>
*
* @param list The collection.
* @param ascending Whether to sort ascending (<code>true</code>) or descending (<code>false</code>).
* @param valueFunction The function that retrieves the value of an entry.
*/
public static <T> void sortByValue(List<T> list, final boolean ascending, @SuppressWarnings("rawtypes") final Function<? extends Comparable, T> valueFunction) {
Collections.sort(list, new Comparator<T>() {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override public int compare(T o1, T o2) {
final Comparable v1 = valueFunction.call(o1);
final Comparable v2 = valueFunction.call(o2);
return v1.compareTo(v2) * (ascending ? 1 : -1);
}
});
}
J'ai essayé Function<? extends Comparable<?>, T>
et Function<? extends Comparable<? extends Comparable>, T>
mais ni compilé, avec une erreur sur l'appel à compareTo
. Pour la première qui est: (capture # 10 de s'étend Comparable)
La méthode compareTo (? Capture # 9 de) dans le type Comparable n'est pas applicable pour les arguments
Pouvez-vous fournir également la classe 'Function'? – melihcelik
Salut, je jette un coup d'oeil à la question et je n'arrive vraiment à rien. Mais un de mes commentaires est, ne niez pas le résultat de 'compareTo()', car si quelqu'un retourne 'Integer.MIN_VALUE' il restera' Integer.MIN_VALUE' et l'ordre de tri ne sera pas ce que vous vouliez. Au lieu de cela, lorsque l'ascendant est faux, inversez l'appel, par ex. de 'a.compareTo (b)' à 'b.compareTo (a);'. J'ennuie je sais ... – Grundlefleck
@Grundlefleck Merci, j'ai implémenté ça. –