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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈建凡 中级黑马   /  2012-3-18 20:06  /  2249 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /**

  2. */
  3. import java.util.*;
  4. class GenericsDemo3
  5. {
  6. public static void main(String [] args)
  7.   {
  8.    //TreeSet 的构造函数 TreeSet(Comparator<? super E> comparator)
  9.     TreeSet<Student> ts=new TreeSet<Student>(new com());
  10.     ts.add(new Student("a07") );
  11.     ts.add(new Student("a05") );
  12.     ts.add(new Student("a06") );
  13.     ts.add(new Student("a01") );
  14.     ts.add(new Student("a00") );
  15.     Iterator<Student> it=ts.iterator();
  16.     while(it.hasNext())
  17.     {
  18.             System.out.println(it.next().getName());
  19.     }
  20.    
  21.    
  22.     TreeSet<Worker> tsa=new TreeSet<Worker>(new com());
  23.     tsa.add(new Worker("a--07") );
  24.     tsa.add(new Worker("a--05") );
  25.     tsa.add(new Worker("a--06") );
  26.     tsa.add(new Worker("a--01") );
  27.     tsa.add(new Worker("a--00") );
  28.     Iterator<Worker> ita=tsa.iterator();
  29.     while(ita.hasNext())
  30.     {
  31.             System.out.println(ita.next().getName());
  32.     }
  33.    
  34.   }
  35. }
  36. class com implements Comparator<Person>
  37. {
  38.           public int compare(Person p1,Person p2)
  39.     {
  40.              return p1.getName().compareTo(p2.getName());
  41.            }
  42. }
  43. class Person
  44. {
  45.   private String name;
  46.   Person(String name)
  47.   {
  48.    this.name=name;       
  49.   }
  50.   public String getName()
  51.   {
  52.    return this.name;       
  53.   }
  54.   public String toString()
  55.   {
  56.    return name;       
  57.   }
  58.   
  59. }
  60. class Student extends Person
  61. {
  62.   Student(String name)
  63.   {
  64.    super(name);       
  65.   }       
  66. }
  67. class Worker extends Person
  68. {
  69.    Worker(String name)
  70.    {
  71.     super(name);       
  72.    }
  73. }
复制代码
? Super  E :  可以接收E类型或者E的父类型
在比较器上面的定义 class com implements Comparator<Person> 了,就是说这个比较器可以被Person的超类 去使用,但是Person的子类,Student和Worder
可以使用的,有点不明白啊

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

4 个回复

倒序浏览
class com implements Comparator<Person>这个比较器是这样得来的:
比较Strdent时定义一个class com implements Comparator<Student>,它可以用于Student和Student的父类型的比较
比较Worker时定义一个class com implements Comparator<Worker>,它可以用于Worker和Worker的父类型的比较
当Person以后再出现新的子类时我们还要定义一个新的比较器,那么既然这些比较器都能接受他们的父类型Person,我们就定义一个Person类型的比较器,以后不管Person再有什么新的子类都可以用这个比较器

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
其实是子类还是父类都是用的多态的观点:父类的引用指向子类的对象,调用的时候用父类的公用的方法。所以你看这里传什么参数的时候按照这点就行了。
比如:
TreeSet(Collection<? extends E> c)  : 这里是形参指向传入的值,根据多态,形参设置为父类,指向子类的对象。用extend实现
TreeSet(Comparator<? super E> comparator)  : 而在这里 要根据Comparator的compare(T o1, T o2)方法判断大小的,所以也是由treeset的元素向Comparator传递实参,所以 Comparator的参数就是传入的父类,也是父类引用指向子类的对象。 用super实现。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
1.java.util
类 TreeSet<E>
2.TreeSet(Comparator<? super E> comparator)
是指:当TreeSet的元素类型为E,那么在使用带有参数的构造函数时,所传入的比较器该为:<? super E>类型,即E类型或其父类型。

3.修改上面的com类的代码:
class com implements Comparator<Student> //
{
          public int compare(Student p1,Student p2) //
    {
             return p1.getName().compareTo(p2.getName());
           }
}
对代码进行编译时,会在该行:
TreeSet<Worker> tsa=new TreeSet<Worker>(new com());
报错,提示不存在这样的构造方法!这就说明“必须保证Comparator比较器的类型是TreeSet集合元素的同类或父类”!

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
    class Comp implements Comparator<Person>
{
        public int compare (Person p1,Person p2)    主要是比较器的泛型要用父类的  传参传过来的子类对象   那不就是刚好 父类引用指向子类对象了吗?
                                                                            比如Person p1 =new Student("abc01");    这是添加的第一个对象,  把对象看做一个参数传到这      
                         {                                           就表现了多态的应用了嘛  所以这里面的法只能调用父类的方法 多态方嘛

                return p2.getName().compareTo(p1.getName());
                        }
}

定义的那两个子类的比较器应该理解没问题吧?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马