Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collections.sort-帮助我删除未选中的警告 List questions=new ArrayList(); addAll(getAllQuestions())//返回一组问题 集合。排序(问题,新BeanComparator(“问题ID”))//org.apache.commons.beanutils.BeanComparator_Java_Generics_Comparator_Apache Commons Beanutils - Fatal编程技术网

Java Collections.sort-帮助我删除未选中的警告 List questions=new ArrayList(); addAll(getAllQuestions())//返回一组问题 集合。排序(问题,新BeanComparator(“问题ID”))//org.apache.commons.beanutils.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”)?因为它不是泛型的,所以您只需抑制 更新:事实上,如果它让你感到困扰的话,你可以将代码库转换为通用代码,因为它是开源的。选项有: 更改比较器以实现比较器。这不是一个真正的选择,因为它是一个众所周知的外部库类。人们不会

在Java1.5中,除了“newbeancomparator(“questionId”)生成未经检查的警告外,上述操作可以正常工作。我不喜欢警告。有没有一种方法可以为BeanComparator提供一个类型,或者我必须使用
@SuppressWarnings(“unchecked”)

因为它不是泛型的,所以您只需抑制

更新:事实上,如果它让你感到困扰的话,你可以将代码库转换为通用代码,因为它是开源的。

选项有:

  • 更改
    比较器
    以实现
    比较器
    。这不是一个真正的选择,因为它是一个众所周知的外部库类。人们不会让你这么做的
  • 如上所述,Fork和modify
    BeanComparator
    ,给它一个不同的FQN
  • 用实现
    比较器的类包装现有的
    BeanComparator
  • 问题的类型更改为
    列表

  • 添加抑制警告注释

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

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


它们支持泛型。

消除警告的唯一方法是更改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。