本帖最后由 Jim-剣◆﹏ 于 2013-10-18 21:41 编辑
- import java.util.*;
- class GenericDemo7
- {
- public static void main(String[] args)
- {
-
- TreeSet<Student> ts = new TreeSet<Student>(new Comp());
- ts.add(new Student("abc03"));
- ts.add(new Student("abc02"));
- ts.add(new Student("abc06"));
- ts.add(new Student("abc01"));
-
- Iterator<Student> it = ts.iterator();
- while(it.hasNext())
- {
- System.out.println(it.next().getName());
- }
- /**/
- TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());
- ts1.add(new Worker("wabc--03"));
- ts1.add(new Worker("wabc--02"));
- ts1.add(new Worker("wabc--06"));
- ts1.add(new Worker("wabc--01"));
- Iterator<Worker> it1 = ts1.iterator();
- while(it1.hasNext())
- {
- System.out.println(it1.next().getName());
- }
- }
- }
- /*
- class StuComp implements Comparator<Student>
- {
- public int compare(Student s1,Student s2)
- {
- return s1.getName().compareTo(s2.getName());
- }
- }
- class WorkerComp implements Comparator<Worker>
- {
- public int compare(Worker s1,Worker s2)
- {
- return s1.getName().compareTo(s2.getName());
- }
- }
- */
- class Comp implements Comparator<Person>
- {
- public int compare(Person p1,Person p2)
- {
- return p2.getName().compareTo(p1.getName());
- }
- }
- class Person
- {
- private String name;
- Person(String name)
- {
- this.name = name;
- }
- public String getName()
- {
- return name;
- }
- public String toString()
- {
- return "person :"+name;
- }
- }
- class Student extends Person
- {
- Student(String name)
- {
- super(name);
- }
- }
- class Worker extends Person
- {
- Worker(String name)
- {
- super(name);
- }
- }
复制代码 首先给毕老师视频中的原代码
泛型限定有个概念
Class person{} Class student extends person{} 假设student是Person的子类,person是父类
如果只想要接收person和person的子类,那么可以给一个泛型限定<? extends person> 如果只想要接收student和它的父类型,那么可以给一个泛型限定<? super student>
api文档中,TreeSet的构造方法里传入的一个带泛型限定的比较器
我要怎么理解里面的这个泛型限定?
先说说毕老师的说法,老师选中图片中划了红线的区域的E说,TreeSet里存的是worker,这里就写worker,TreeSet里存的是Student,这里就写Student,这样很麻烦,然后毕老师说可以写他们的父类型,即Person,那么这个比较器就可以接收Person和person的子类对象了
毕老师视频中写的比较器的泛型限定就是 - class Comp implements Comparator<Person>
- {
- public int
- compare(Person p1,Person p2)
- {
- return
- p2.getName().compareTo(p1.getName());
- }
- }
复制代码 那这样就可以比较同时比较Person对象,Person的子类Student对象,Person的子类worker对象,这我明白
但是,TreeSet的构造方法TreeSet(Comparator<? super E > comparator )里面的这个参数泛型限定该怎么理解
我的理解是比较器的泛型限定传入了Person,比较器默认把Person传入替代了E,变成Comparator<? super Person>,但是根据<? super Person>的概念,就说明,这个比较器可以接收Person和person的父类,但明显person本身就是父类了,不对啊
如果不是这样理解,那为什么不像下面这样定义比较器,而要像上面那样定义比较器呢?- class Comp implements Comparator<? super Person>
- {
- public int compare(Person p1,Person p2)
- {
- return p2.getName().compareTo(p1.getName());
- }
- }
复制代码 |