Java Collections.sort - помогите убрать непроверенное предупреждение - PullRequest
9 голосов
/ 01 декабря 2009
List<Question> questions = new ArrayList<Question>();
questions.addAll(getAllQuestions()); //returns a set of Questions
Collections.sort(questions, new BeanComparator("questionId")); //org.apache.commons.beanutils.BeanComparator

В Java 1.5 все вышеперечисленное работает нормально, за исключением того, что новый beanComparator (questionId) генерирует непроверенное предупреждение Я не люблю предупреждения. Есть ли способ, которым я могу предоставить BeanComparator тип, или я должен использовать @SuppressWarnings("unchecked")?

Ответы [ 8 ]

10 голосов
/ 01 декабря 2009

Варианты:

  • Заменить BeanComparator на реализацию Comparator<Question>. Это нереальный вариант, поскольку это хорошо известный класс внешней библиотеки. Люди не позволят вам сделать это.
  • Разложите и измените BeanComparator, как указано выше, присвоив ему другое FQN.
  • Оберните существующий BeanComparator классом, который реализует Comparator<Question>.
  • Измените тип questions на List<?>.
  • Добавить аннотацию для подавления предупреждений.
5 голосов
/ 01 декабря 2009

Так как BeanComparator не является универсальным, вам просто нужно подавить.

ОБНОВЛЕНИЕ: На самом деле, если это вас достаточно беспокоит, вы можете раскошелиться на кодовую базу, чтобы сделать ее универсальной, поскольку она с открытым исходным кодом.

1 голос
/ 03 мая 2012

Создание универсального класса-оболочки:

public class GenericBeanComparator<T> implements Comparator<T> {
  private final BeanComparator myBeanComparator;

  public GenericBeanComparator(String property) {
    myBeanComparator = new BeanComparator(property);
  }

  public int compare(T o1, T o2) {
    return myBeanComparator.compare(o1, o2);
  }
}

Используйте это так:

List<Question> questions = new ArrayList<Question>();
questions.addAll(getAllQuestions()); //returns a set of Questions
Collections.sort(questions, new GenericBeanComparator<Question>("questionId"));
1 голос
/ 06 января 2011

Если не добавить новый универсальный класс в Apache Commons Beanutils, лучшее, что я нашел, - это обернуть BeanComparator новым методом в моей "панели инструментов 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 <a
 * href="http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/BeanComparator.html">Apache's Bean
 * Comparator</a> for more details.
 * @param <T> generic type
 * @param propertyExpression propertyExpression
 * @return the comparator
 */
@SuppressWarnings("unchecked")
public static <T> Comparator<T> createPropertyComparator(final String propertyExpression) {
    return new BeanComparator(propertyExpression);
}
0 голосов
/ 05 октября 2011

BeanComparator - очень маленький класс. Возьмите исходный код и измените его следующим образом:

public class BeanComparator<E> implements Comparator<E>, Serializable {

И измените ваш вызов следующим образом:

Collections.sort(yourCollection, new BeanComparator<yourBeanClass>(yourProperty));

И вуаля предупреждения исчезли.

0 голосов
/ 01 декабря 2009

Единственный способ удалить предупреждение - это изменить код BeanComparator, но даже если бы вы могли, если бы вы не сделали это специальной оболочкой, которая понимает ваш конкретный тип, концепция не сработает. Класс воздействует на любой объект посредством отражения, которое может иметь или не иметь метод. По своей природе он не безопасен.

Самый простой способ обойти это предупреждение - создать собственный компаратор:

 public class QuestionComparator extends Comparator<Question> {
      private BeanComparator peer = new BeanComparator("questionId");

      public int compare(Question o1, Question o2) {
             return peer.compare(o1, o2);
      }
 }

Вы также можете реализовать equals, если это имеет значение, и вызвать метод equals BeanComparator следующим образом:

   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);
   }
0 голосов
/ 01 декабря 2009

Вы всегда можете переключиться на использование Google Collections.

Они поддерживают Generics.

0 голосов
/ 01 декабря 2009

Да, вы должны использовать @SuppressWarnings ("unchecked"). Нет оснований полагать, что компаратор, не использующий генерики, может вызвать проблему в этом случае.

...