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在基于的排序函数中参数化Comparable以及为什么在基于的排序函数中使用rawListIteratorComparator

  2. for循环中,为什​​么在基于的排序函数中需要类型转换(to TComparable以及为什么在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]);
        }
}
4

1 回答 1

3

为什么在基于 Comparator 的排序函数中使用原始 ListIterator。

您不能创建类型数组,? super T[]因此它会从那里创建Object[]并使用原始类型。

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

在第一种情况下,你有ListIterator<T>which can only set(T),在第二种情况下,你有ListIteratorwhich 可以设置任何对象。

于 2012-08-09T08:51:37.003 回答