2009-11-30 7 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" をキャストしてみてくださいましたか? –

+0

それはちょうど別の警告を発生させます。 – skaffman

+0

まったく別の何か、あなたはむしろQuestionDAOで 'ORDER BY id'をしたいのですか? – BalusC

答えて

10

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

  • 変更BeanComparatorComparator<Question>を実装します。これはよく知られている外部ライブラリクラスであるため、ここでは実際の選択肢ではありません。人々はあなたにそれをさせるつもりはありません。
  • 上記のようにBeanComparatorをフォークして変更し、別のFQNを与えます。
  • Comparator<Question>を実装するクラスで既存のBeanComparatorをラップします。
  • questionsのタイプをList<?>に変更してください。
  • 抑制警告アノテーションを追加します。
+0

"警告の警告を追加する"。それは最後の手段でなければなりません。あなたが100%確信しているときにのみ起こるべきです。 –

+3

はい。しかし、このような状況では、あなたは100%確実になることができます。間違いを犯すと、予期しないところでClassCastExceptionが発生します。 –

5

BeanComparatorは一般的ではないため、抑制する必要があります。

更新:実際には、あなたには十分な煩わしさがある場合、オープンソースであるため、コードベースをフォークして汎用にすることができます。

0

はい、@SuppressWarnings( "未チェック")を使用することになっています。この場合、ジェネリックを使用しないコンパレータが問題を引き起こす可能性があると考える理由はありません。

0

いつでもGoogleコレクションを使用することができます。

Genericsをサポートしています。

0

警告を取り除く唯一の方法は、BeanComparatorのコードを変更することですが、たとえ可能であっても、特定の型を理解できる特定のラッパーにしない限り、コンセプトはうまく機能しません。このクラスは、メソッドを持っているかもしれないし、持たないかもしれない反射によって、どんなオブジェクトでも動作します。それは本質的にtypesafeではありません。

警告周りの最も簡単な方法は、あなた自身のコンパレータを実装することです:

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を呼び出しますない限り

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 toolbox"の新しいメソッドで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")); 
関連する問題