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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡卿 中级黑马   /  2012-6-18 12:03  /  1621 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡卿 于 2012-6-18 12:33 编辑

  1. import java.util.*;
  2. class GenericDemo8
  3. {
  4. public static void main(String[] args)
  5. {
  6. //TreeSet(Comparator<? super E> comparator)
  7. TreeSet<Student> ts = new TreeSet<Student>(new CompareByName());

  8. ts.add(new Student("s1"));
  9. ts.add(new Student("s3"));
  10. ts.add(new Student("s2"));
  11. ts.add(new Student("s0"));

  12. System.out.println(ts);

  13. TreeSet<Worker> ts1 = new TreeSet<Worker>(new CompareByName());

  14. ts1.add(new Worker("w1"));
  15. ts1.add(new Worker("w3"));
  16. ts1.add(new Worker("w2"));
  17. ts1.add(new Worker("w0"));

  18. System.out.println(ts1);
  19. }
  20. }
  21. class CompareByName implements Comparator<Person>//? super E//只要能接收集合中的元素对象即可所以Student可以 Person也可以
  22. {
  23. public int compare(Person s1,Person s2)
  24. {
  25. return s1.getName().compareTo(s2.getName());
  26. }
复制代码
为什么<Person>可以呢,<? super E>不是接收E或者E的父类型么,那么Student,和Worker明明是Person的子类啊,为什么可以这样写,
还是说这E指的不是Person?

2 个回复

正序浏览
很简单的问题,为啥给搞复杂了尼?
比较器在使用泛型时一般都涉及到了泛型的下限(用?super E 表示)。其实这里完全没有必要在子类类型、父类类型、比较器使用的泛型之间绕来绕去。
一句话:比较器使用啥泛型,就能对相应类型及其子类集合进行排序。比如上例,比较器的泛型是Person,那么这个比较器就可以对装有Person和Person子类的集合进行排序,当然也能对Student和Worker类型的集合进行排序喽。
如果还不懂,在用一个形象的比喻:你说一个可以对动物进行排序的比较器,能对猫或者狗进行排序吗?
结果当然是肯定的了。
回复 使用道具 举报
楼主,如果有机会可以查一下JDK API
java.util 包中
接口 Comparator<T>,他中的泛型只能一个确切的对象,而不是可以继承父类的子类.
public interface Comparator<T>比较函数强行对某些对象 collection 进行整体排序。
可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。
还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。

至于楼主的意思可能把他误以为是方法了.
这是我查找API官方的方法:
Comparator<? super K> comparator()
          返回用于对此映射进行排序的比较器,如果此映射使用它的键的自然顺序,则返回 null。
Comparator<? super E> comparator()
          返回用于确定已排序 set 顺序的比较器,或者,如果此树 set 使用其元素的自然顺序,则返回 null。
这个方法还有几个类中有,是java.util.concurrent.PriorityBlockingQueue.comparator()
java.util.PriorityQueue.comparator()
java.util.SortedMap.comparator()
java.util.SortedSet.comparator()
java.util.TreeMap.comparator()
java.util.TreeSet.comparator() .
这些方法都可以像楼主使用的那样泛型中使用继承父类的子类或者是父类本身.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马