1

MyInterface を実装する任意のクラスのオブジェクトのリストに対して、一般的な並べ替えユーティリティ メソッドを実装しようとしています。Java API ( http://java.sun.com/javase/6/docs/api/java/util/Collections.html ) ごとに、Collections.sort() メソッドのシグネチャは次のとおりです。

public static <T> void sort(List<T> list, Comparator<? super T> c)

ワイルドカード パラメーターを使用したリストが「プレーンな」パラメーター化されたリストを置き換えることができるかどうかはわかりませんが、次のことを試しました。

static void mySort(List<? extends MyInterface> myList, SortCriteria mySortCriteria) {
    Collections.sort(myList, new Comparator<? super MyInterface>() {
        ...
    });
}

コンパイル時エラーが発生し、

The type new Comparator(){} cannot extend or implement Comparator<? super MyInterface>
A supertype may not specify any wildcard.

だから、私はそれを次のように変更しました:

static void mySort(List<? extends MyInterface> myList, SortCriteria mySortCriteria) {
    Collections.sort(myList, new Comparator<MyInterface>() {
        ...
    });
}

そして、コンパイルして動作します。良い説明はありますか?

4

2 に答える 2

2

ここでは反変性を使用しています。

基本的に、リスト内の任意の 2 つの項目を比較できるコンパレータが必要です。リストがタイプの場合、Tそれはタイプ T の任意の 2 つの項目を比較できる必要があることを意味しますが、T が X のサブクラスであるタイプ X の任意の 2 つの項目を比較できる場合、それも問題ありません。

私のお気に入りの例を挙げると、任意の 2 つの形状を面積で比較できる比較器がある場合、それを使用して任意の 2 つの三角形を比較できることは明らかList<Triangle>ですAreaShapeComparator

最後の段落の「試したとき」が何を意味しているのかわかりません...うまくいかない短いが完全な例を挙げていただければ、その理由を説明することができます.

編集:わかりました、式内で? extends Xまたはを使用することはできません-メソッド、型、または変数のいずれかの宣言の一部としてのみ使用できます。新しいオブジェクトを作成するときは、正確なタイプを指定する必要があります。? extends Ynew

于 2009-10-08T20:29:23.767 に答える
1

Comparator に対するこの制約の影響がわかりません

制約は、コンパレータが少なくとも のジェネリック型Listまたはそれのスーパータイプを比較できなければならないことを示しています。たとえば、 a を使用して aComaparator<Number>をソートすることは有効ですList<Integer>Comparatorが s を比較できる場合、NumberもちろんIntegers を比較できます。

于 2009-10-08T20:30:17.773 に答える