2

複数のコンパレータを 1 つに結合するヘルプ メソッドを作成しました。

public static <T> Comparator<T> createComparatorChain( final Comparator<T>... comparators )
{
    return new Comparator<T>()
    {
        public int compare( T lhs, T rhs )
        {
            for( Comparator<T> comparator : comparators )
            {
                int order = comparator.compare( lhs, rhs );
                if( order != 0 )
                {
                    return order;
                }
            }
            return 0;
        }   
    };
}

しかし、この方法を使用すると、チェックされていない警告が表示されます。

Collections.<File>sort( list, ComparatorUtils.<File>createComparatorChain( BY_FILE_DIRECTORY, BY_FILE_NAME ) );

型の安全性: Comparator のジェネリック配列が varargs パラメーター用に作成されます。

一般的な構文に何か問題がありますか? 誰でも私を助けることができますか?

4

2 に答える 2

4

一般的な構文に何か問題がありますか?

いいえ、これは Java ジェネリックの実装方法に関する別の問題です。基本的に、配列とジェネリック型はうまく連携しません。詳細については、Java ジェネリックに関する FAQを参照してください。

この特定のケースでは、配列からではなく、互いにリンクされているいくつかのコンパレータからチェーンを構築します。それぞれが優先度の高いものと現在の優先度の低いものを知っています。それは配列を避けます。各コンパレータは、その親に比較を実行するように依頼し、ゼロ以外の場合は結果を直接返すか、独自の比較を実行してそれ以外の場合はそれを返します。「トップ」コンパレーターには親がないため、独自の比較を実行するだけです。

幸いなことに、これを自分で記述する必要さえありません。またはでGuavaを使用できます。配列のバージョンにたオーバーロードがありますが、安全なパラメーターを取ることに注意しください。ComparisonChainOrdering.compoundcompoundIterable<? extends Comparator<? super T>>

于 2013-04-12T06:14:14.000 に答える