读书人

这个 TreeSet 集合中的 泛型限定 supe

发布时间: 2012-05-23 13:44:13 作者: rapoo

这个 TreeSet 集合中的 泛型限定 super 问题
[code=Java][/code]import java.util.*;
class Person {
  private String name;
  Person(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }
}
class Student extends Person {
  Student(String name) {
    super(name);
  }
}
class Worker extends Person {
  Worker(String name) {
    super(name);
  }
}
class Comp implements Comparator<Person> { //这里可以接收子类对象
  public int compare(Person p1, Person p2) { //这里可以接收子类对象
    return p1.getName().compareTo(p2.getName());
  }
}
public class GenericDemo06 {
  public static void main(String[] args) {
    TreeSet<Student> t1 = new TreeSet<Student>(new Comp());
    t1.add(new Student("stu01"));
    t1.add(new Student("stu05"));
    t1.add(new Student("stu03"));

    TreeSet<Worker> t2 = new TreeSet<Worker>(new Comp());
    t2.add(new Worker("work 01"));
    t2.add(new Worker("work 07"));
    t2.add(new Worker("work 05"));

    printColl(t1);
    printColl(t2);
  }
  public static void printColl(TreeSet<? extends Person> t) { //接受 Person 及其子类
    Iterator<? extends Person> it = t.iterator();
    while(it.hasNext())
      System.out.println(it.next().getName());
  }
}

TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。

以上两行是API文档里查的 TreeSet<E> 的一个构造方法及其描述,里面写的是 <? super E>
意思是说,只能接受比较 E 或者 E 的父类的比较器,代码中 TreeSet 里传的是 Person类型,那不就是说传入的比较器只能接受比较 Person 类或者 Person 的父类的对象吗?
为什么能比较 Person 的子类 Student 和 Worker 类型呀???
这点有点晕,求大神指教,解释一下


[解决办法]
LZ你是自己把自己绕糊涂了吧

public class TreeSet<E> ..
这是类的定义,

然后构造方法
TreeSet(Comparator<? super E> comparator)
注意,这里的 ? 是 TreeSet类定义中的泛型 E 的父类

所以
TreeSet<Student> t1 = new TreeSet<Student>(new Comp());
TreeSet接受的是Student泛型参数,构造方法的Comp接受的是Person泛型参数,满足构造方法的 Person super Student 的关系,也就是说TreeSet的 E 是Student, 构造方法的Comp的 ? 是Person, 所以没有什么问题,LZ再好好自己体会

读书人网 >J2SE开发

热点推荐