黑马程序员技术交流社区

标题: 泛型上下限,大惑不解 求援 [打印本页]

作者: 刘 佳    时间: 2012-10-30 14:21
标题: 泛型上下限,大惑不解 求援
本帖最后由 刘 佳 于 2012-10-30 16:19 编辑

<? super E>泛型下限。 毕老师第15天 泛型限定2的视频看不懂


TreeSet(Comparator<? super E> comparator)

<? super E>泛型下限,这么理解?   ?是父类还是E是父类啊?
比较器comparator<>的<>中传入的是E或者E的父类?

毕老师上课的例子传入TreeSet中的比较器是comp<Person>,这个Person代表的是<? super E>中的?还是E呢? 实为不解。

作者: 李连闯    时间: 2012-10-30 14:53
<? super E> 中的?表示E或者是E的父类,在E类型已知的情况下接受的类型匹配的是?;
Comparator<? super E>中的E是未知的,需要我们先来指定E,Comparator<Person>是在构建指定自己的关于Person的比较器,所以Person指定的是E;
作者: 刘 佳    时间: 2012-10-30 14:57
李连闯 发表于 2012-10-30 14:53

你自己说的自相矛盾啊、、
作者: 李靖    时间: 2012-10-30 15:02
限定符的上边界:? extends Number 表示类型是Number类型或者是Number的子类。

限定符的下边界: ?super Integer  Vector<? super Integer> v =new Vector<Number>();是正确的

结合着extends就可以很好的理解super了,因为这两个一个是上边界一个是下边界,这两个正好是相反的
作者: 刘 佳    时间: 2012-10-30 15:09
bhxiaobo 发表于 2012-10-30 15:02
限定符的上边界:? extends Number 表示类型是Number类型或者是Number的子类。

限定符的下边界: ?super ...

还是不理解 ,麻烦根据我的提问回答问题
作者: 李连闯    时间: 2012-10-30 15:09
刘 佳 发表于 2012-10-30 14:57
你自己说的自相矛盾啊、、

通常我们使用的是例如List<?  extends Number> list = new ArrayList<Double>();Number是已知的,这里的Double匹配的是“?”

对于TreeSet(Comparator<? super E> comparator)来讲,首先这里的E是未知的,需要自己指定的,Comparator<Person>指定的就是这里的E,
作者: 刘 佳    时间: 2012-10-30 15:12
李连闯 发表于 2012-10-30 15:09
通常我们使用的是例如List

如果E被指定被Person,那子类不就是Person吗? 也就是传入的必须是Person的父类。而恰恰相反,Person是父类
作者: 李连闯    时间: 2012-10-30 15:17
本帖最后由 李连闯 于 2012-10-30 15:30 编辑
刘 佳 发表于 2012-10-30 14:57
你自己说的自相矛盾啊、、


发指于我的错误a,哈哈,
如果是自定义的Comparator的时候有指定泛型类型的(把你的代码贴出来会好些)
像:
class MyComparator implements Comparator<Human>{
...
}
也就是E是在这里指定了的,之后作为参数传进自己的比较器的person匹配的还是?,抱歉抱歉,
作者: 李连闯    时间: 2012-10-30 15:24
本帖最后由 李连闯 于 2012-10-30 15:35 编辑
刘 佳 发表于 2012-10-30 15:12
如果E被指定被Person,那子类不就是Person吗? 也就是传入的必须是Person的父类。而恰恰相反,Person是父 ...


代码贴出来看下,浪费你时间了抱歉,
作者: 刘 佳    时间: 2012-10-30 15:44
本帖最后由 刘 佳 于 2012-10-30 15:46 编辑
李连闯 发表于 2012-10-30 15:24
代码贴出来看下,浪费你时间了抱歉,

  1. <P>import java.util.*;
  2. class GenericDemo7
  3. {
  4. public static void main(String[] args)
  5. {
  6.   
  7.   TreeSet<Student> ts = new TreeSet<Student>(new Comp());</P>
  8. <P>  ts.add(new Student("abc03"));
  9.   ts.add(new Student("abc02"));
  10.   ts.add(new Student("abc06"));
  11.   ts.add(new Student("abc01"));
  12.   
  13.   Iterator<Student> it = ts.iterator();</P>
  14. <P>  while(it.hasNext())
  15.   {
  16.    System.out.println(it.next().getName());
  17.   }
  18. </P>
  19. <P> </P>
  20. <P>  TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());</P>
  21. <P>  ts1.add(new Worker("wabc--03"));
  22.   ts1.add(new Worker("wabc--02"));
  23.   ts1.add(new Worker("wabc--06"));
  24.   ts1.add(new Worker("wabc--01"));</P>
  25. <P>
  26.   Iterator<Worker> it1 = ts1.iterator();</P>
  27. <P>  while(it1.hasNext())
  28.   {
  29.    System.out.println(it1.next().getName());
  30.   }
  31. }
  32. }</P>
  33. <P>class Comp implements Comparator<Person>
  34. {
  35. public int compare(Person p1,Person p2)
  36. {
  37.   return p2.getName().compareTo(p1.getName());
  38. }
  39. }</P>
  40. <P>
  41. class Person
  42. {
  43. private String name;
  44. Person(String name)
  45. {
  46.   this.name = name;
  47. }
  48. public String getName()
  49. {
  50.   return name;
  51. }
  52. public String toString()
  53. {
  54.   return "person :"+name;
  55. }
  56. }</P>
  57. <P>class Student extends Person
  58. {
  59. Student(String name)
  60. {
  61.   super(name);
  62. }</P>
  63. <P>}</P>
  64. <P>class Worker extends Person
  65. {
  66. Worker(String name)
  67. {
  68.   super(name);
  69. }
  70. }
  71. </P>
复制代码

作者: 李连闯    时间: 2012-10-30 15:50
本帖最后由 李连闯 于 2012-10-30 15:59 编辑

TreeSet<Student>或者TreeSet<Worker>的时候指定了E;
TreeSet(Comparator<? super E> comparator) 表明自定义比较器的时候可以传入E或者E的父类型,
这里面的E是由TreeSet<Student>这儿确定了的
(TreeSet(Comparator<? super E> comparator) 这个方法是类TreeSet<E>的方法,
所以Comparator<? super E>的E是由TreeSet<E>的E来确定的,
所以TreeSet<Student>确定了Comparator<? super E>是Comparator<? super Student>),
所以传入的Person匹配的是"?",之前说的有些问题,抱歉。
作者: 刘 佳    时间: 2012-10-30 16:16
李连闯 发表于 2012-10-30 15:50
TreeSet或者TreeSet的时候指定了E;
TreeSet(Comparator

才看到你发的这个。我自己做了不少测试,也证明了E是TreeSet中定义的类型。只要传入E的父类即可。早点看见就不用浪费一下午去理解了。

不过还是谢谢
作者: 杨志男    时间: 2012-10-30 16:27
Comparator(? super E)是指<>里放的要么是E,要么是E的父类,比如comp<Person>,Person是自定义的一个类,<>里你要么放Person,要么放Person的父类,你要将? super E当成一个整体看,就是说如果Person继承Biology(生物)类,那<>里也可以填Biology
作者: 李建强    时间: 2012-10-30 17:02
本帖最后由 李建强 于 2012-10-30 17:07 编辑

通俗的这么记忆
<? super E>  <我 超过   E>  ,超过E,你就是超类
<? extends E>  <我 继承  E>, 继承E,你就是子类了

TreeSet<Student> ts = new TreeSet<Student>(new Comp());
TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());
来看看TreeSet的构造方法:
TreeSet(Comparator<? super E> comparator) ,这个E就是TreeSet中的泛型,这个问号在上面指的是Student和Worker。
Comparator<? super E>就是说比较器里只能比较Student和Worker的超类,他们的超类就是Person。

不懂继续问我,好久没见了







作者: 刘 佳    时间: 2012-10-30 17:26
李建强 发表于 2012-10-30 17:02
通俗的这么记忆

谢谢

是啊,搁置了几天。15期你进了吗?
作者: 李建强    时间: 2012-10-31 08:39
刘 佳 发表于 2012-10-30 17:26
谢谢

是啊,搁置了几天。15期你进了吗?

没有呢,面试时间还没回复
作者: 齐连涛    时间: 2012-10-31 18:46
? extends Number 限定符的上边界 表示类型是Number类型或者是Number的子类。

?super Integer 限定符的下边界  Integer 或Integer的父类




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