2009-11-30 1 views
9
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")?Java Collections.sort - помогите удалить снятое предупреждение

+0

Пробовали ли вы кастинг "новый BeanComparator" к (Компаратор )? –

+0

Это просто поднимет другое предупреждение. – skaffman

+0

Просто что-то совсем другое, разве вам не хотелось бы делать «ORDER BY id» в QuestionDAO? – BalusC

ответ

10

Варианты:

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

«Добавить аннотацию предупреждений о подавлении». Это должно быть последним средством, должно произойти только и только тогда, когда вы на 100% уверены, что это безопасно. –

+3

Ну да. Но в таких ситуациях вы можете быть на 100% уверены. И если вы ошибаетесь, то худшее, что вы получите, это ClassCastException в неожиданном месте. –

5

С BeanComparator не является общим, вам просто нужно подавить.

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

0

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

0

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

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

0

Единственный способ удалить предупреждение - это изменить код 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); 
     } 
} 

Можно также реализовать приравнивает, если это имеет значение, и вызовите 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); 
    } 
1

Если только добавив новый универсальный класс в Apache Commons Beanutils, лучшее, что я нашел, - это превратить BeanComparator в новый метод в моем «bean toolbox»:

/** 
* 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

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

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

и изменить свой вызов, как это:

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

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

1

Создать общий класс обертку:

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