A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

例如:
  1. TreeSet(Comparator<? super E> comparator)
复制代码
是TreeSet的一个构造函数

在调用时我们传给它的比较器是如下定义的
  1. class Comp implements Comparator<Person>{.....}
复制代码
这个不是向下限定吗?那为什么最后这个比较器能够操作的是Person和它的子类的对象呢?


9 个回复

倒序浏览
<? super E>是不是就是说这个接口可以接收的是处理E和E的父类的接口对象、????
回复 使用道具 举报
泛型是编译期检查的,只要引用类型绝对匹配就ok,至于里面是否是子类型,那是运行时检查的,所以可以操作子类,但不能是子类型的引用,
ArrayList<Animal> list = new ArrayList<Animal>();
Animal animal = new Animal();
Animal cat = new Cat();
Cat cat2 = new Cat();
list.add(animal);//ok
list.add(cat);//ok
list.add(cat2);//complile error
希望我的回答能够帮助到您。您对我的回答是否感到满意呢?如果满意的话,请回复一下非常感谢!
回复 使用道具 举报
  E是Student ,     
         TreeSet<Student> t1 = new TreeSet<Student>(new Comp());
回复 使用道具 举报
少写一点:
        TreeSet<E>(Comparator<? super E> comparator)
   类 TreeSet<E>,E是set集合操作的内容 ,  与形参是不同的概念。
回复 使用道具 举报
耀阳圣尊 发表于 2015-6-22 18:38
泛型是编译期检查的,只要引用类型绝对匹配就ok,至于里面是否是子类型,那是运行时检查的,所以可以操作子 ...

就是说比如我定义TreeSet中存储的引用数据类型为Student,那么是不是就是说可以接收的构造器得是处理Student或者它的父类的,之所以我们传入的是最父类Person是为了能顺利通过编译期的检查,然后因为在比较器中用的也是父类方法,所以也不会报错。是这样吗
回复 使用道具 举报
改变 中级黑马 2015-6-23 09:38:27
7#
上限是<? super E>,下线是<? Extends E>。
回复 使用道具 举报
Nemo 中级黑马 2015-6-23 09:42:53
8#

拜托,你去看清楚再来回答问题啊。。。。。。<? super E>是下限,因为它时限定了最子类,所以叫下限,<? extends E>是上限,因为它限定了最父类
回复 使用道具 举报
改变 中级黑马 2015-6-23 09:48:43
9#
Nemo 发表于 2015-6-23 09:42
拜托,你去看清楚再来回答问题啊。。。。。。

抱歉,我的错。
回复 使用道具 举报
Nemo 发表于 2015-6-23 09:26
就是说比如我定义TreeSet中存储的引用数据类型为Student,那么是不是就是说可以接收的构造器得是处理Stud ...

也可以这么理解。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马