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