Java Collections.sort-帮助我删除未选中的警告 List questions=new ArrayList(); addAll(getAllQuestions())//返回一组问题 集合。排序(问题,新BeanComparator(“问题ID”))//org.apache.commons.beanutils.BeanComparator
在Java1.5中,除了“newbeancomparator(“questionId”)生成未经检查的警告外,上述操作可以正常工作。我不喜欢警告。有没有一种方法可以为BeanComparator提供一个类型,或者我必须使用Java Collections.sort-帮助我删除未选中的警告 List questions=new ArrayList(); addAll(getAllQuestions())//返回一组问题 集合。排序(问题,新BeanComparator(“问题ID”))//org.apache.commons.beanutils.BeanComparator,java,generics,comparator,apache-commons-beanutils,Java,Generics,Comparator,Apache Commons Beanutils,在Java1.5中,除了“newbeancomparator(“questionId”)生成未经检查的警告外,上述操作可以正常工作。我不喜欢警告。有没有一种方法可以为BeanComparator提供一个类型,或者我必须使用@SuppressWarnings(“unchecked”)?因为它不是泛型的,所以您只需抑制 更新:事实上,如果它让你感到困扰的话,你可以将代码库转换为通用代码,因为它是开源的。选项有: 更改比较器以实现比较器。这不是一个真正的选择,因为它是一个众所周知的外部库类。人们不会
@SuppressWarnings(“unchecked”)
?因为它不是泛型的,所以您只需抑制
更新:事实上,如果它让你感到困扰的话,你可以将代码库转换为通用代码,因为它是开源的。选项有:
- 更改
以实现比较器
。这不是一个真正的选择,因为它是一个众所周知的外部库类。人们不会让你这么做的比较器
- 如上所述,Fork和modify
,给它一个不同的FQNBeanComparator
- 用实现
比较器的类包装现有的
BeanComparator
- 将
问题的类型更改为
列表
- 添加抑制警告注释
它们支持泛型。消除警告的唯一方法是更改BeanComparator的代码,但即使可以,除非您使其成为理解特定类型的特定包装器,否则该概念也无法正常工作。该类通过反射对任何对象进行操作,该对象可能具有该方法,也可能不具有该方法。它本质上是不安全的 绕过警告的最简单方法是实现您自己的比较器:
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
除非在Apache Commons Beanutils中添加新的泛型类,否则我发现最好的方法是在我的“bean工具箱”中的一个新方法中包装BeanComparator:
/**
*包装Apache Commons BeanComparator。创建一个比较器,通过指定的bean比较两个bean
*财产。属性表达式可以使用Apache的嵌套、索引、组合和映射语法@有关更多详细信息,请参阅。
*@param泛型类型
*@param propertyExpression propertyExpression
*@返回比较器
*/
@抑制警告(“未选中”)
公共静态比较器createPropertyComparator(最终字符串propertyExpression){
返回新的BeanComparator(propertyExpression);
}
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);
}
}
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);
}
}
公共类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);
}
}
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);
}
}
排序(yourCollection,newbeancomparator(yourProperty));
瞧,警告消失了。创建一个通用包装类:
/**
* 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);
}
公共类GenericBeanComparator实现了Comparator{
私人最终BeanComparator myBeanComparator;
公共GenericBeanComparator(字符串属性){
myBeanComparator=新的BeanComparator(属性);
}
公共整数比较(tO1,tO2){
返回myBeanComparator.compare(o1,o2);
}
}
像这样使用它:
public class QuestionComparator extends Comparator<Question> {
private BeanComparator peer = new BeanComparator("questionId");
public int compare(Question o1, Question o2) {
return peer.compare(o1, o2);
}
}
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 questions=new ArrayList();
questions.addAll(getAllQuestions());//返回一组问题
排序(问题,新的GenericBeanComparator(“问题ID”));
您是否尝试将“新BeanComparator”强制转换为(Comparator)?这只会引发不同的警告。完全不同的是,您不想在问题DAO中按id进行排序吗?“添加抑制警告注释”.这应该是最后的手段,只有在你100%确信安全的情况下才会发生。是的。但在这种情况下,你可以100%确信。如果你犯了错误,最糟糕的是你会在一个意想不到的地方发生ClassCastException。