黑马程序员技术交流社区

标题: 关于泛型 [打印本页]

作者: 黄捷    时间: 2012-6-14 10:40
标题: 关于泛型
    在用到类Collections的sort方法时,其中限定泛型是这个样子:sortpublic static <T> void sort(List<T> list, Comparator<? super T> c)

那请问该泛型3个<T>相同么?为什么会相同或者为什么不相同呢?或者是<T>对于这个泛型没有任何影响,只是一个限定而已?求解释啊

作者: 张_涛    时间: 2012-6-14 10:47
sortpublic static <T> void sort(List<T> list, Comparator<? super T> c)
对于这个代码,真没看懂...现在我就给出这么几点:
1.第一个<T>你既然定义了返回为void,那么泛型是针对集合使用的,无返回值了这个就没有了意思
2.三个<T>是不一样的,它只是对集合中存放数据类型的限定,你传入<Person>那<T>就代表了<Person>。就是说意思都是对数据类型限定,但具体什么类型是不一样的。
3.关于泛型的作用:
    1)如果不用泛型,则必须使用强制类型转换,而强制类型转换是不安全,在运行期可能发生ClassCastException异常,如果使用泛型,则会在编译期就能发现该错误
    2)使用泛型可以避免大量的类型转换,提高性能
作者: 黄捷    时间: 2012-6-14 10:58
涅槃子衿 发表于 2012-6-14 10:47
sortpublic static  void sort(List list, Comparator

这个是查的API给出的,原文是:sort

public static <T> void sort(List<T> list,
                            Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。此列表内的所有元素都必须是使用指定比较器可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,c.compare(e1, e2) 不得抛出 ClassCastException)。
此排序被保证是稳定的:不会因调用 sort 方法而对相等的元素进行重新排序。

排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n log(n) 性能。 指定列表必须是可修改的,但不必是可大小调整的。此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置处每个元素的列表上进行迭代。这避免了由于试图对适当位置上的链接列表进行排序而产生的 n2 log(n) 性能。

因此我比较想知道这三个<T>是否是相同类型,按照你说的,如果传<Person>那<T>就代表<Person>这点我知道,那这是不是意味着这三个<T>都是<Person>呢
作者: 张_涛    时间: 2012-6-14 11:15
public static <T> void sort(List<T> list, Comparator<? super T> c)这里面一共有三个<T>:
1. 第一个<T>假设作为返回类型的,那么当你定义一个List<Person>并将其返回,那么这个<T>你可以写为<Person>
2.第二个是你待排序的链表内元素数据类型,那么如果元素类型是<Dog>,那你<T>就是<Dog>了
3.应该是一个函数,那么表示这个函数接受参数的类型
当你进行对<Person>排序是,那么这三个<T>,那么你传入的返回的都应该是<Person>
当你对<Dog>排序是,那么这三个<T>,那么你传入的返回的都应该是<Dog>
貌似解释的不好,不好意思。这是我理解的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2