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")」が unchecked 警告を生成することを除いて、上記は正常に機能します。私は警告が好きではありません。BeanComparator にタイプを提供する方法はありますか、または使用する必要があります@SuppressWarnings("unchecked")か?

4

8 に答える 8

10

オプションは次のとおりです。

  • BeanComparatorを実装するように変更しますComparator<Question>。これはよく知られている外部ライブラリ クラスであるため、ここでは実際のオプションではありません。人々はあなたにそれをさせません。
  • 上記のようにフォークして変更BeanComparatorし、別の FQN を指定します。
  • BeanComparatorを実装するクラスで既存のものをラップしますComparator<Question>
  • のタイプをquestionsに変更しList<?>ます。
  • 警告抑制の注釈を追加します。
于 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

BeanComparator は非常に小さなクラスです。ソース コードを取得し、次のように変更します。

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

呼び出しを次のように変更します。

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

そしてほら、警告が消えました。

于 2011-10-05T13:55:48.507 に答える
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 に答える