我对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
在排序函数中基于Comparable
进行参数化,为什么 raw ListIterator
在基于{{1}的排序函数中使用}
在Comparator
循环中,为什么在基于for
的sort函数中需要类型转换(到T
)以及为什么在Comparable
循环中不需要强制转换基于for
的排序功能?
我认为以下代码对于基于比较器的排序函数具有更多类型安全性:
Comparator
答案 0 :(得分:3)
为什么原始ListIterator用于基于Comparator的sort函数。
您无法创建? super T[]
类型的数组,因此它会创建Object[]
并使用原始类型。
在for循环中,为什么基于Comparable的sort函数需要Type Casting(to T)?为什么在基于Comparator的for循环中不需要强制转换
在第一种情况下,您ListIterator<T>
只能set(T)
,而在第二种情况下,您有ListIterator
可以设置任何对象。