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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 轻语。 高级黑马   /  2014-4-17 11:17  /  1387 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 伍叶竹 于 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. }
复制代码




评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

11 个回复

倒序浏览
这个重点是多态的内容,Person p=new Student();  Person p1=new Worker(); 都是对的嘛,这个就是多态嘛,就是有一点要注意,最后一个比较器中的实例调用的方法必须是在父类中定义的,也就是说是子类都有的功能,如果Student中的比较方法内容是比较Student中特有的方法,那么最后一个比较器就不行了
回复 使用道具 举报
1,Student和Worker都是Person的子类
    第三个 因为Person类是父类 所以这里涉及到了多态
     Person  p=new Student();
     Person p1=new Worker();
2,name属性是父类的属性,由子类继承而来,所以是他们的共有属性,当然可以比较
3, 如果学生类里有个成绩属性的话,而学生的比较器中要再加上比较成绩的话,显然Woker没有成绩这一属性
      成绩属性就是不共有属性,就不能再这样抽取了,所以这样也是有一定条件和局限性
回复 使用道具 举报
这其实是一个关于泛型上限的问题!

  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:30
这个重点是多态的内容,Person p=new Student();  Person p1=new Worker(); 都是对的嘛,这个就是多态嘛, ...

多态这部分能理解。 主要是泛型那里,
   Comparator<>这里API中应该是 <? super E> 吧?还是<? extend E>
我一直跟3L的理解是一样的。
回复 使用道具 举报
⒈心只霸占沵 发表于 2014-4-17 11:32
1,Student和Worker都是Person的子类
    第三个 因为Person类是父类 所以这里涉及到了多态
     Person  p= ...

多态这部分能理解。 主要是泛型那里,
   Comparator<>这里API中应该是 <? super E> 吧?还是<? extend E>
我一直跟3L的理解是一样的。
回复 使用道具 举报
伍叶竹 发表于 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:04
1.我觉得你也可以把泛型理解为所有类的父类
    还拿Student和Worker、Person来说,不管是子类还是父类, ...

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

java.util
接口 Comparator<T>
是这个,把T定义为Person,里面当然可以传Person的子类了
回复 使用道具 举报
伍叶竹 发表于 2014-4-17 12:27
你的第一点说到了泛型和多态。把泛型理解为父类也很形象、 你的第二点就是泛型的应用。 传什么类型,就是 ...

我查了jdk1.6的API  写的是Comparator<T>
回复 使用道具 举报
月光海 发表于 2014-4-17 12:35
java.util
接口 Comparator
是这个,把T定义为Person,里面当然可以传Person的子类了 ...

代码还有一部分没贴进来。  TreeSet中传入比较器的。 先3Q了。
回复 使用道具 举报
⒈心只霸占沵 发表于 2014-4-17 12:40
我查了jdk1.6的API  写的是Comparator

嗯 是我代码还有关于TreeSet 中传入 比较器的没贴。 3Q all the way = =。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马