A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘 佳 中级黑马   /  2012-10-30 14:21  /  3729 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘 佳 于 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呢? 实为不解。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

16 个回复

倒序浏览
<? super E> 中的?表示E或者是E的父类,在E类型已知的情况下接受的类型匹配的是?;
Comparator<? super E>中的E是未知的,需要我们先来指定E,Comparator<Person>是在构建指定自己的关于Person的比较器,所以Person指定的是E;
回复 使用道具 举报
李连闯 发表于 2012-10-30 14:53

你自己说的自相矛盾啊、、
回复 使用道具 举报
限定符的上边界:? extends Number 表示类型是Number类型或者是Number的子类。

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

结合着extends就可以很好的理解super了,因为这两个一个是上边界一个是下边界,这两个正好是相反的
回复 使用道具 举报
bhxiaobo 发表于 2012-10-30 15:02
限定符的上边界:? extends Number 表示类型是Number类型或者是Number的子类。

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

还是不理解 ,麻烦根据我的提问回答问题
回复 使用道具 举报
刘 佳 发表于 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:00
7#
李连闯 发表于 2012-10-30 15:09
通常我们使用的是例如List

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


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


代码贴出来看下,浪费你时间了抱歉,

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘 佳 于 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: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 15:50
TreeSet或者TreeSet的时候指定了E;
TreeSet(Comparator

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

不过还是谢谢
回复 使用道具 举报
Comparator(? super E)是指<>里放的要么是E,要么是E的父类,比如comp<Person>,Person是自定义的一个类,<>里你要么放Person,要么放Person的父类,你要将? super E当成一个整体看,就是说如果Person继承Biology(生物)类,那<>里也可以填Biology
回复 使用道具 举报
本帖最后由 李建强 于 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:02
通俗的这么记忆

谢谢

是啊,搁置了几天。15期你进了吗?
回复 使用道具 举报
刘 佳 发表于 2012-10-30 17:26
谢谢

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

没有呢,面试时间还没回复
回复 使用道具 举报
? extends Number 限定符的上边界 表示类型是Number类型或者是Number的子类。

?super Integer 限定符的下边界  Integer 或Integer的父类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马