2009-11-30 111 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中,除了'new BeanComparator(“questionId”)'生成未经检查的警告,上述工作正常。我不喜欢警告。有没有一种方法可以提供BeanComparator类型,还是我必须使用@SuppressWarnings("unchecked")Java Collections.sort - 帮我删除未经检查的警告

+0

你尝试铸造 “新BeanComparator” 到(比较)? – 2009-11-30 22:28:22

+0

这只会提出不同的警告。 – skaffman 2009-11-30 22:30:22

+0

只是完全不同的东西,你不喜欢在QuestionDAO中做'ORDER BY id'吗? – BalusC 2009-11-30 22:50:23

回答

10

选项包括:

  • 变化BeanComparator实施Comparator<Question>。鉴于这是一个众所周知的外部图书馆类,这里不是一个真正的选择。人们不会让你这样做。
  • 叉和修改BeanComparator如上所述,给它一个不同的FQN。
  • 用实现Comparator<Question>的类包装现有的BeanComparator
  • questions的类型更改为List<?>
  • 添加禁止警告注释。
+0

“添加禁止警告注释”。这应该是最后的手段,应该只发生,只有当你100%确定它是安全的。 – 2009-11-30 22:34:08

+3

好的。但在这种情况下,你可以100%确定。如果你犯了一个错误,你会得到最糟糕的一个ClassCastException在一个意想不到的地方。 – 2009-11-30 22:38:59

5

由于BeanComparator不是通用的,您只需要抑制。

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

0

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

0

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

他们支持泛型。

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 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); 
    } 
1

除非在Apache Commons Beanutils中添加一个新的泛型类,我发现的最好的方法是在我的“bean工具箱”中用一种新方法包装BeanComparator:

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