10
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 下,上述工作正常,除了 'new BeanComparator("questionId")' 生成未经检查的警告。我不喜欢警告。有没有办法可以为 BeanComparator 提供一个类型,还是必须使用@SuppressWarnings("unchecked")

4

8 回答 8

10

选项是:

  • 改变BeanComparator实施Comparator<Question>。这不是一个真正的选择,因为它是一个众所周知的外部库类。人们不会让你这样做。
  • 像上面一样fork 和修改BeanComparator,给它一个不同的 FQN。
  • BeanComparator一个实现Comparator<Question>.
  • 将类型更改questionsList<?>
  • 添加抑制警告注释。
于 2009-11-30T22:32:21.963 回答
5

由于BeanComparator不是通用的,你只需要压制。

更新:实际上,如果它足够困扰您,您可以分叉代码库以使其通用,因为它是开源的。

于 2009-11-30T22:27:06.310 回答
1

除非在 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);
}
于 2011-01-06T03:01:08.617 回答
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"));
于 2012-05-03T15:43:33.143 回答
0

是的,您应该使用@SuppressWarnings("unchecked")。在这种情况下,没有理由认为不使用泛型的比较器会导致问题。

于 2009-11-30T22:46:34.493 回答
0

您可以随时切换到使用 Google 收藏。

他们支持泛型。

于 2009-11-30T22:47:45.740 回答
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);
      }
 }

如果重要,您还可以实现 equals,并像这样调用 BeanComparator equals 方法:

   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);
   }
于 2009-11-30T22:50:59.380 回答
0

BeanComparator 是一个非常小的类。获取源代码并修改如下:

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

并像这样修改您的调用:

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

瞧,警告消失了。

于 2011-10-05T13:55:48.507 回答