1. 程式人生 > ><T extends Comparable<? super T>>

<T extends Comparable<? super T>>

tool start ted tools 源代碼 static 了解 -m ron

在看Collections源代碼中,看到如下代碼:
[java] view plain copy
  1. public static <T extends Comparable<? super T>> void sort(List<T> list) {
  2. Object[] a = list.toArray();
  3. Arrays.sort(a);
  4. ListIterator<T> i = list.listIterator();
  5. for (int j=0; j<a.length; j++) {
  6. i.next();
  7. i.set((T)a[j]);
  8. }
  9. }

有點郁悶,不知道一下代碼是啥意思
[java] view plain copy
  1. <T extends Comparable<? super T>>

百度後了解了這是Java泛型的知識點,然後就自己測試一下,以下是測試代碼:
[java] view plain copy
  1. /**
  2. * Created by CSH on 12/7/2015.
  3. */
  4. //測試泛型
  5. public class TestGeneric {
  6. @Test
  7. public void test01(){
  8. new A<If<Father>>(); //不報錯
  9. new B<If<Father>>(); //不報錯
  10. new C<If<Father>>(); //不報錯
  11. new A<If<Child>>(); //報錯
  12. new B<If<Child>>(); //報錯
  13. new C<If<Child>>(); //不報錯
  14. new A<If<GrandFather>>(); //不報錯
  15. new B<If<GrandFather>>(); //報錯
  16. new C<If<GrandFather>>(); //報錯
  17. }
  18. }
  19. class GrandFather {
  20. }
  21. class Father extends GrandFather{
  22. }
  23. class Child extends Father {
  24. }
  25. interface If<T>{
  26. void doSomething();
  27. }
  28. class A <T extends If<? super Father>> {
  29. }
  30. class B <T extends If<Father>> {
  31. }
  32. class C <T extends If<? extends Father>>{
  33. }

結果是:

技術分享

這例子可以區分super和extends這2個關鍵字的區別
super:<? super Father> 指的是Father是上限,傳進來的對象必須是Father,或者是Father的父類,因此 new A<If<Child>>()會報錯,因為Child是Father的子類
extends:<? extends Father> 指的是Father是下限,傳進來的對象必須是Father,或者是Father的子類,因此 new C<If<GrandFather>>()會報錯,因為GrandFather是Father的父類
<Father> 指的是只能是Father,所以new B<If<Child>>()和 new B<If<GrandFather>>()都報錯

<T extends Comparable<? super T>>