2

私はJavaでのジェネリックの使用法にかなり慣れていません。

Collections.javaクラスでソートする次の関数に出くわしました

// Sorting based on Comparable
public static <T extends Comparable<? super T>> void sort(List<T> list) {
    Object[] a = list.toArray();
    Arrays.sort(a);
    ListIterator<T> i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
}


// Sorting based on Comparator
public static <T> void sort(List<T> list, Comparator<? super T> c) {
    Object[] a = list.toArray();
    Arrays.sort(a, (Comparator)c);
    ListIterator i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set(a[j]);
    }
}

私が理解したいのは:

  1. ListIteratorに基づいて並べ替え関数でパラメーター化されるのはなぜですか?また、に基づいて並べ替え関数でrawが使用されるのはComparableなぜですか? ListIteratorComparator

  2. ループでは、に基づくソート関数forで型キャスト ( へT) が必要なのはなぜですか?また、に基づくソート関数のループでComparableキャストが必要ないのはなぜですか?forComparator

次のコードは、コンパレータ ベースの並べ替え関数に対してよりタイプ セーフになると思います。

public static <T> void Sort(List<T> list, Comparator<? super T> c) {
        Object[] a = list.toArray();
        Arrays.sort(a, (Comparator)c);
        ListIterator<T> i = list.listIterator();
        for (int j=0; j<a.length; j++) {
            i.next();
            i.set((T)a[j]);
        }
}
4

1 に答える 1

3

Comparator に基づくソート関数で生の ListIterator が使用される理由。

型の配列を作成することはできないため、? super T[]代わりに を作成し、Object[]そこから生の型を使用します。

for ループでは、Comparable に基づくソート関数でタイプ キャスト (T へ) が必要な理由と、Comparator に基づくソート関数の for ループでキャストが必要ない理由

最初のケースでは、どのオブジェクトListIterator<T>のみを設定できset(T)、2 番目のケースでは、ListIterator任意のオブジェクトを設定できます。

于 2012-08-09T08:51:37.003 に答える