Java Collections实用程序类中排序函数实现的比较

Java Collections实用程序类中排序函数实现的比较,java,generics,Java,Generics,我对Java中泛型的用法还很陌生 在Collections.javaclass中遇到了以下用于排序的函数 // 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

我对Java中泛型的用法还很陌生

Collections.java
class中遇到了以下用于排序的函数

// 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

无法创建类型为
的数组?super T[]
因此它创建了一个
对象[]
,并从中使用原始类型

在for循环中,为什么在基于Comparable的sort函数中需要类型转换(to T),而在基于Comparator的sort函数的for循环中不需要类型转换


在第一种情况下,您有
ListIterator
,它只能
设置(T)
,在第二种情况下,您有
ListIterator
,它可以设置任何对象。

如果输入列表是参数化的,那么在第二种情况下允许设置任何对象不是一个错误吗?
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]);
        }
}