Je pense que la réponse à la question de savoir pourquoi vous finissez par appeler la compareTo(Object)
au lieu de la méthode spécifique est parce que votre définition de classe dit implements Comparable
(sans aucun paramètre de type). Sans type générique, tout type comme T
sera par défaut Object
.
Il existe plusieurs solutions à ce problème. La première a déjà été recommandée par d'autres personnes et consiste à fabriquer votre propre carte de crédit personnalisée. Comparator<Blabla>
et de les utiliser dans vos méthodes de tri. Comme ces comparateurs sont des objets distincts, ils n'interfèrent pas avec le comportement de la classe existante. Prenons l'exemple de ces comparateurs, sur une certaine classe Person
qui a getName()
y getAge()
méthodes. Vous pouvez en créer autant que vous le souhaitez.
public class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
public class NameComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}
Après avoir obtenu ce résultat, vous pouvez décider si vous souhaitez ou non modifier votre classe d'origine pour qu'elle implémente correctement Comparable<Blabla>
. À ce moment-là, vous retirez le compareTo(Object)
entièrement et garder l'autre. Lorsque vous compilez, ou lorsque vous enregistrez dans votre IDE, vous découvrirez alors tous les endroits où cet objet est référencé en tant que Comparable
sans type, et ils seront affichés comme des avertissements ou des erreurs de compilation. C'est alors à vous de décider comment corriger le code dans chaque cas. Cela dépend en grande partie de ce que le compareTo(Object)
fait différemment de la méthode compareTo(Blabla)
méthode. S'il fait explicitement un instanceof
vérifier et/ou couler directement vers le type Blabla
alors la conversion devrait être sûre à 100 %, car cela signifie que tout le code existant doit l'utiliser correctement si vous ne rencontrez jamais de problème avec la conversion. ClassCastException
au moment de l'exécution.