Java Collections.sort - 帮我删除未经检查的警告

时间:2009-11-30 22:23:55

标签: java generics comparator apache-commons-beanutils

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

8 个答案:

答案 0 :(得分:10)

选项包括:

  • 更改BeanComparator以实施Comparator<Question>。这不是一个真正的选择,因为它是一个众所周知的外部库类。人们不会让你这样做。
  • 如上所述分叉并修改BeanComparator,为其提供不同的FQN。
  • 使用实现BeanComparator的类来包装现有的Comparator<Question>
  • questions的类型更改为List<?>
  • 添加抑制警告注释。

答案 1 :(得分:5)

由于BeanComparator不是通用的,因此您只需要压制。

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

答案 2 :(得分: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);
}

答案 3 :(得分: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"));

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

他们支持泛型。

答案 6 :(得分: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);
   }

答案 7 :(得分:0)

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

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

并修改你的调用:

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

voilà警告消失了。