class Comp implements Comparator<Person> {
public int compare(Person p1, Person p2) { //这里的参数就是多态,这里不管是传的是学生,还是工人都只会当作Person来看的。是把他们当作 Person 来 比较的。
return p1.getName().compareTo(p2.getName());
}
}
回答:代码中 TreeSet 里传的是 Person类型,那不就是说传入的比较器只能接受比较 Person 类或者 Person 的父类的对象吗? 为什么能比较 Person 的子类 Student 和 Worker 类型呀???
注意:你理解的 这里只能接受比较 Person 类或者 Person 的父类的对象 是对的,但是你要记清多态思想,可以将子类对象 提升为父类用,只是要失去子类的特有行为和属性,
所以TreeSet 里面我们进行比较 Student 和 Worker ,都是把他们当作Person来看的,
提示:你要留意 compare(Person p1, Person p2) 这个方法的参数类型。作者: cyh8807 时间: 2013-3-16 00:34
TreeSet(Comparator<? super E> comparator)
这个TreeSet的构造函数函数里面传的是一个比较器,这个比较器可以定义为泛型, ? super E :可以接受E类型或者E的父类型,下限。
这个楼主说的没有错,因为比较器所接受的泛型可以为Person或者Person的父类,但是楼主往里面所传的已经是一个Person类了,那边比较器以及定义成功
那么既然父类都具备比较功能了,子类Student和Worker又继承了Person,它们也就同时具备了父类所拥有的比较器功能
这里主要涉及的是多态的问题,既然你比较器里面传的参数是Person,那边它的子类Student和Worker也同样可以传递给比较器
也就是是说你的class Comp implements Comparator<Person> 包含了
class Comp implements Comparator<Student> 及class Comp implements Comparator<Worker>
我想到这里你应该可以理解了吧
而接下来在集合的构造函数中传递一个已经定义好的比较器,那么楼主所传递的比较器是父子类都可以用的
在此再重新声明下TreeSet集合的两种排序方式:以便大家都复习下
TreeSet默认排序方式:让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo()方法。
TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数