黑马程序员技术交流社区

标题: 关于<? super E>与<? extends E>的问题 [打印本页]

作者: 小黑子    时间: 2014-9-14 13:25
标题: 关于<? super E>与<? extends E>的问题
现有如下类关系:
class SuperPeron
{}
class Person extends SuperPeron
{}
class Student extends Person
{}
class Worker extends Person
{}
本来我以为,<? extends E> 是向上限定,参数类型可以是E及其子类,但不能是E的父类。(事也确实这样)
本来我以为,<? super E> 是向下限定,参数类型可以是E及其父类,但不能是E的子类。(但看了毕老师的视频:day15-13集合框架(泛型限定2),我就不会了。。。)
毕老师在讲的时候,两次打开API强调: TreeSet(Comparator<? super E> comparator) 中的<? super E>,所以我觉得他就是在讲<? super E>的用法。
可是<? super E>应该是”向下限定,参数类型可以是E及其父类,但不能是E的子类“。 但是毕老师这一节视频中讲的,完全不是这个规则。毕老师讲的恰恰是“参数类型可以是E及其子类,但不能是E的父类 ”。代码如下:是我哪里理解错了呀~~~~求指教!!!
  1. /*
  2.         <? super Person> 验证二
  3. */


  4. import java.util.TreeSet;
  5. import java.util.Iterator;
  6. import java.util.Comparator;

  7. class SuperPerson
  8. {
  9.         private String name;
  10.         SuperPerson(String name)
  11.         {
  12.                 this.name = name;
  13.         }
  14.        
  15.         public String getName()
  16.         {
  17.                 return name;
  18.         }
  19. }

  20. class Person extends SuperPerson
  21. {       
  22.         Person(String name)
  23.         {
  24.                 super(name);
  25.         }       
  26. }
  27. class Student extends Person
  28. {
  29.         Student(String name)
  30.         {
  31.                 super(name);
  32.         }
  33.        
  34. }
  35. class Worker extends Person
  36. {
  37.         Worker(String name)
  38.         {
  39.                 super(name);
  40.         }
  41. }


  42. class Comp implements Comparator<Person>
  43. {
  44.         public int compare(Person p1,Person p2)
  45.         {
  46.                 return p1.getName().compareTo(p2.getName());
  47.         }
  48. }

  49. class GenericDemo5
  50. {
  51.         public static void main(String[] args)
  52.         {
  53. //                System.out.println("==========SuperPerson=============");
  54. //                TreeSet<SuperPerson> tssp = new TreeSet<SuperPerson>(new Comp());
  55. //                tssp.add(new SuperPerson("ssssssssppppppsaaa"));
  56. //                tssp.add(new SuperPerson("ssssssssppppppsght"));
  57. //                tssp.add(new SuperPerson("ssssssssppppppsbc"));

  58. //                Iterator<SuperPerson> itsp = tssp.iterator();
  59. //                while(itsp.hasNext())
  60. //                {
  61. //                        System.out.println(itsp.next().getName());
  62. //                }
  63. //
  64.                 System.out.println("==========Person=============");
  65.                 TreeSet<Person> tsp = new TreeSet<Person>(new Comp());
  66.                 tsp.add(new Person("ppppppsaaa"));
  67.                 tsp.add(new Person("ppppppsght"));
  68.                 tsp.add(new Person("ppppppsbc"));

  69.                 Iterator<Person> itp = tsp.iterator();
  70.                 while(itp.hasNext())
  71.                 {
  72.                         System.out.println(itp.next().getName());
  73.                 }

  74.                 System.out.println("==========Student=============");
  75.                 TreeSet<Student> tss = new TreeSet<Student>(new Comp());
  76.                 tss.add(new Student("saaa"));
  77.                 tss.add(new Student("sght"));
  78.                 tss.add(new Student("sbc"));

  79.                 Iterator<Student> its = tss.iterator();
  80.                 while(its.hasNext())
  81.                 {
  82.                         System.out.println(its.next().getName());
  83.                 }
  84.                
  85.                 System.out.println("==========Worker=============");
  86.                 TreeSet<Worker> tsw = new TreeSet<Worker>(new Comp());
  87.                 tsw.add(new Worker("wwwaaa"));
  88.                 tsw.add(new Worker("wwwght"));
  89.                 tsw.add(new Worker("wwwbc"));

  90.                 Iterator<Worker> itw = tsw.iterator();
  91.                 while(itw.hasNext())
  92.                 {
  93.                         System.out.println(itw.next().getName());
  94.                 }
  95.                
  96.         }
  97. }

  98. ///////////////////////---若没有注释掉SuperPerson,报错如下---//////////////////////
  99. /*

  100. GenericDemo5.java:61: error: no suitable constructor found for TreeSet(Comp)
  101.                 TreeSet<SuperPerson> tssp = new TreeSet<SuperPerson>(new Comp())
  102. ;
  103.                                             ^
  104.     constructor TreeSet.TreeSet(NavigableMap<SuperPerson,Object>) is not applica
  105. ble
  106.       (argument mismatch; Comp cannot be converted to NavigableMap<SuperPerson,O
  107. bject>)
  108.     constructor TreeSet.TreeSet(Comparator<? super SuperPerson>) is not applicab
  109. le
  110.       (argument mismatch; Comp cannot be converted to Comparator<? super SuperPe
  111. rson>)
  112.     constructor TreeSet.TreeSet(Collection<? extends SuperPerson>) is not applic
  113. able
  114.       (argument mismatch; Comp cannot be converted to Collection<? extends Super
  115. Person>)
  116.     constructor TreeSet.TreeSet(SortedSet<SuperPerson>) is not applicable
  117.       (argument mismatch; Comp cannot be converted to SortedSet<SuperPerson>)
  118. Note: Some messages have been simplified; recompile with -Xdiags:verbose to get
  119. full output
  120. 1 error

  121. */
复制代码





作者: 小黑子    时间: 2014-9-15 15:20
直接都没有看的么?:Q
作者: 小黑子    时间: 2014-9-15 22:03
为何还是木有人??:'(:'(
作者: 小黑子    时间: 2014-9-16 07:18
大神在哪里?
作者: 谢建平    时间: 2014-9-16 07:54
  TreeSet<SuperPerson> tssp = new TreeSet<SuperPerson>(new Comp());  

说明你存的是SuperPerson 类的对象 所以你的比较器要能比较  SuperPerson 或者 SuperPerson的父类对象才行

而你new Comp()   比较的是Person  只能用来比较Person及Person的子类对象  比较不了其父类对象
如果你把Comp类 的 Person改成SuperPerson 就又可以了




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