Java Collections.sort – aidez-moi à supprimer l’avertissement non vérifié

List questions = new ArrayList(); questions.addAll(getAllQuestions()); //returns a set of Questions Collections.sort(questions, new BeanComparator("questionId")); //org.apache.commons.beanutils.BeanComparator 

Sous Java 1.5, ce qui précède fonctionne bien, sauf que le “nouveau BeanComparator (” questionId “)” génère un avertissement non contrôlé. Je n’aime pas les avertissements. Existe-t-il un moyen de fournir un type au BeanComparator ou dois-je utiliser @SuppressWarnings("unchecked") ?

Les options sont:

  • Changez BeanComparator pour implémenter le Comparator . Ce n’est pas une option réelle ici, étant donné qu’il s’agit d’une classe de bibliothèque externe bien connue. Les gens ne vont pas vous laisser faire.
  • Fork et modifie BeanComparator comme ci-dessus, en lui donnant un FQN différent.
  • Enveloppez le BeanComparator existant avec une classe qui implémente le Comparator .
  • Changez le type de questions en List .
  • Ajoutez une annotation de suppression des avertissements.

BeanComparator n’étant pas générique, vous devrez simplement le supprimer.

UPDATE: En fait, si cela vous dérange assez, vous pouvez créer une base de code pour la rendre générique, car elle est Open Source.

À moins d’append une nouvelle classe générique à Apache Commons Beanutils, le mieux que j’ai trouvé était d’envelopper BeanComparator dans une nouvelle méthode de ma “boîte à outils bean”:

 /** * Wrapping of Apache communs BeanComparator. Create a comparator which compares two beans by the specified bean * property. Property expression can use Apache's nested, indexed, combinated, mapped syntax. @see Apache's Bean * Comparator for more details. * @param  generic type * @param propertyExpression propertyExpression * @return the comparator */ @SuppressWarnings("unchecked") public static  Comparator createPropertyComparator(final Ssortingng propertyExpression) { return new BeanComparator(propertyExpression); } 

Créez une classe wrapper générique:

 public class GenericBeanComparator implements Comparator { private final BeanComparator myBeanComparator; public GenericBeanComparator(Ssortingng property) { myBeanComparator = new BeanComparator(property); } public int compare(T o1, T o2) { return myBeanComparator.compare(o1, o2); } } 

Utilisez-le comme ceci:

 List questions = new ArrayList(); questions.addAll(getAllQuestions()); //returns a set of Questions Collections.sort(questions, new GenericBeanComparator("questionId")); 

Oui, vous êtes censé utiliser @SuppressWarnings (“décoché”). Dans ce cas, il n’y a aucune raison de penser que le comparateur qui n’utilise pas de génériques peut poser problème

Vous pouvez toujours utiliser Google Collections.

Ils soutiennent les génériques.

La seule façon de supprimer l’avertissement serait de modifier le code de BeanComparator, mais même si vous le pouviez, le concept ne fonctionnerait pas correctement à moins d’en faire un wrapper spécifique qui comprend votre type particulier. La classe agit sur tout object par reflection, avec ou sans la méthode. Il n’est pas insortingnsèquement sécuritaire.

La solution la plus simple consiste à implémenter votre propre comparateur:

  public class QuestionComparator extends Comparator { private BeanComparator peer = new BeanComparator("questionId"); public int compare(Question o1, Question o2) { return peer.compare(o1, o2); } } 

Vous pouvez également implémenter equals si cela compte et appeler la méthode BeanComparator equals comme ceci:

  public boolean equals(Object o) { //boiler plate code here to ensure o is an instance of Question and not null return ((QuestionComparator) o).peer.equals(peer); } 

BeanComparator est une très petite classe. Prenez le code source et modifiez-le comme ceci:

public class BeanComparator implements Comparator, Serializable {

Et modifiez votre invocation comme ceci:

Collections.sort(yourCollection, new BeanComparator(yourProperty));

Et voilà les avertissements ont disparu.