黑马程序员技术交流社区

标题: 关于比较器和泛型一点问题 [打印本页]

作者: 轻语。    时间: 2014-4-17 11:17
标题: 关于比较器和泛型一点问题
本帖最后由 伍叶竹 于 2014-4-17 12:42 编辑



Student 和 Worker 都是Person 子类。 以下三个比较器,如何理解第三个比较器即可实现前两个比较器功能。

  1. class StuComp implements Comparator<Student>
  2. {
  3. public int compare(Student s1,Student s2)
  4. {
  5.   return s1.getName().compareTo(s2.getName());
  6. }
  7. }
  8. class WorkerComp implements Comparator<Worker>
  9. {
  10. public int compare(Worker s1,Worker s2)
  11. {
  12.   return s1.getName().compareTo(s2.getName());
  13. }
  14. }
  15. class Comp implements Comparator<Person>
  16. {
  17. public int compare(Person p1,Person p2)
  18. {
  19.   return p2.getName().compareTo(p1.getName());
  20. }
  21. }
复制代码





作者: 月光海    时间: 2014-4-17 11:30
这个重点是多态的内容,Person p=new Student();  Person p1=new Worker(); 都是对的嘛,这个就是多态嘛,就是有一点要注意,最后一个比较器中的实例调用的方法必须是在父类中定义的,也就是说是子类都有的功能,如果Student中的比较方法内容是比较Student中特有的方法,那么最后一个比较器就不行了
作者: ⒈心只霸占沵    时间: 2014-4-17 11:32
1,Student和Worker都是Person的子类
    第三个 因为Person类是父类 所以这里涉及到了多态
     Person  p=new Student();
     Person p1=new Worker();
2,name属性是父类的属性,由子类继承而来,所以是他们的共有属性,当然可以比较
3, 如果学生类里有个成绩属性的话,而学生的比较器中要再加上比较成绩的话,显然Woker没有成绩这一属性
      成绩属性就是不共有属性,就不能再这样抽取了,所以这样也是有一定条件和局限性

作者: 虎牛龙马    时间: 2014-4-17 11:38
这其实是一个关于泛型上限的问题!

  1. 15.class Comp implements Comparator[color=Red]<Person>
  2. [/color]
  3. 16.{

  4. 17. public int compare(Person p1,Person p2)

  5. 18. {

  6. 19.  return p2.getName().compareTo(p1.getName());

  7. 20. }
复制代码

由于Student和Worker都是Person的子类,上面标红的其实就是<? extends Person>的意思
根据类的多态还有泛型上限的定义,利用第三个比较器也可比较Student和Worker的对象!
作者: 轻语。    时间: 2014-4-17 11:51
月光海 发表于 2014-4-17 11:30
这个重点是多态的内容,Person p=new Student();  Person p1=new Worker(); 都是对的嘛,这个就是多态嘛, ...

多态这部分能理解。 主要是泛型那里,
   Comparator<>这里API中应该是 <? super E> 吧?还是<? extend E>
我一直跟3L的理解是一样的。

作者: 轻语。    时间: 2014-4-17 11:52
⒈心只霸占沵 发表于 2014-4-17 11:32
1,Student和Worker都是Person的子类
    第三个 因为Person类是父类 所以这里涉及到了多态
     Person  p= ...

多态这部分能理解。 主要是泛型那里,
   Comparator<>这里API中应该是 <? super E> 吧?还是<? extend E>
我一直跟3L的理解是一样的。
作者: ⒈心只霸占沵    时间: 2014-4-17 12:04
伍叶竹 发表于 2014-4-17 11:52
多态这部分能理解。 主要是泛型那里,
   Comparator这里API中应该是

1.我觉得你也可以把泛型<T>理解为所有类的父类
    还拿Student和Worker、Person来说,不管是子类还是父类,这三个类中name 是共同的,所以你可以把name理解为T这三个类的父类,name是T这个类的属性,而Student和Worker、Person是继承了这个类,再用多态的方式理解就可以了
2.上一种方式理解有点不太合理
   你可以把它抽象的理解一个不固定的类型,谁用到了就是谁的类型,那个类用它,它就是那个类的类型
作者: 轻语。    时间: 2014-4-17 12:27
⒈心只霸占沵 发表于 2014-4-17 12:04
1.我觉得你也可以把泛型理解为所有类的父类
    还拿Student和Worker、Person来说,不管是子类还是父类, ...

你的第一点说到了泛型和多态。把泛型理解为父类也很形象、 你的第二点就是泛型的应用。 传什么类型,就是那个类型。
可是这里我主要是想搞清楚
Comparator<>这里在API中应该是 <? super E> 的 (没记错的话,也就是接收E或者E的父类型)
                        于是第三个比较器这里我感觉变成<? extend E>了。接收Person或者Person子类型都是可以的。
作者: 月光海    时间: 2014-4-17 12:35
伍叶竹 发表于 2014-4-17 12:27
你的第一点说到了泛型和多态。把泛型理解为父类也很形象、 你的第二点就是泛型的应用。 传什么类型,就是 ...

java.util
接口 Comparator<T>
是这个,把T定义为Person,里面当然可以传Person的子类了
作者: ⒈心只霸占沵    时间: 2014-4-17 12:40
伍叶竹 发表于 2014-4-17 12:27
你的第一点说到了泛型和多态。把泛型理解为父类也很形象、 你的第二点就是泛型的应用。 传什么类型,就是 ...

我查了jdk1.6的API  写的是Comparator<T>
作者: 轻语。    时间: 2014-4-17 12:41
月光海 发表于 2014-4-17 12:35
java.util
接口 Comparator
是这个,把T定义为Person,里面当然可以传Person的子类了 ...

代码还有一部分没贴进来。  TreeSet中传入比较器的。 先3Q了。
作者: 轻语。    时间: 2014-4-17 12:43
⒈心只霸占沵 发表于 2014-4-17 12:40
我查了jdk1.6的API  写的是Comparator

嗯 是我代码还有关于TreeSet 中传入 比较器的没贴。 3Q all the way = =。




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