私は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
なぜですか?ListIterator
Comparator
ループでは、に基づくソート関数
for
で型キャスト ( へT
) が必要なのはなぜですか?また、に基づくソート関数のループでComparable
キャストが必要ないのはなぜですか?for
Comparator
次のコードは、コンパレータ ベースの並べ替え関数に対してよりタイプ セーフになると思います。
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]);
}
}