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

时间:2012-08-09 08:46:25

标签: java generics

我对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在排序函数中基于Comparable进行参数化,为什么 raw ListIterator在基于{{1}的排序函数中使用}

  2. Comparator循环中,为什​​么在基于for的sort函数中需要类型转换(到T)以及为什么在Comparable循环中不需要强制转换基于for的排序功能?

  3. 我认为以下代码对于基于比较器的排序函数具有更多类型安全性:

    Comparator

1 个答案:

答案 0 :(得分:3)

  

为什么原始ListIterator用于基于Comparator的sort函数。

您无法创建? super T[]类型的数组,因此它会创建Object[]并使用原始类型。

  

在for循环中,为什​​么基于Comparable的sort函数需要Type Casting(to T)?为什么在基于Comparator的for循环中不需要强制转换

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