私は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]);
    }
}
私が理解したいのは:
ListIteratorに基づいて並べ替え関数でパラメーター化されるのはなぜですか?また、に基づいて並べ替え関数でrawが使用されるのはComparableなぜですか?ListIteratorComparatorループでは、に基づくソート関数
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]);
        }
}