? extends E :传入的类型是E类型或者E类型的子类
? super E :传入的类型是E类型或者E类型的父类
? :无限定
缺点:
? extends E :参数为泛型的方法不能使用
? super E :返回值为泛型的方法不能使用
? :参数和返回值为泛型的方法不能使用
关于TreeSet和TreeMap传入比较器进行排序的问题.
这里TreeMap的构造方法public TreeMap(Comparator<? super K> comparator),
比如有一个类Person及它的子类Student,
创建比较器的时候传入Person.
new Comparator<Person> (){
@Override
public int compare(Person o1, Person o2) {
int num = o1.getAge() - o2.getAge();
return num == 0 ? o1.getName().compareTo(o2.getName()) : num;
}
}
但是这个比较器却可以比较Student,和Person.按照定义 ? super E :传入的类型是E类型或者E类型的父类
这里好像传入的是它的子类Student也可以.但是实际上传入Comparator对象的时候会将这个比较器comparator赋给
这个对象里面的比较器comparator.如下所示
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
添加的时候要会把这个比较器赋值给put()方法里的 Comparator<? super K>,
所以? super E :传入的类型是E类型或者E类型的父类是正确的.
添加的时候会变成这样 Comparator<? super Student> cpr = comparator
这里comparator就是自己创建的比较器.它接收的泛型是Person.所以无论创建集合的时候集合的泛型是Student还是Person
就是说集合的put()方法中Comparator<? super K> 中的K是Student或Person.自己创建的比较器是接收的泛型是Person就是它
的父类或者本类
public V put(K key, V value) {
//代码省略
Comparator<? super K> cpr = comparator;
//代码省略
} |
|