日期:2014-05-20  浏览次数:20760 次

这个 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再好好自己体会