黑马程序员技术交流社区

标题: 谁来解释一下泛型的向上向下限定啊 [打印本页]

作者: Nemo    时间: 2015-6-22 13:22
标题: 谁来解释一下泛型的向上向下限定啊
例如:
  1. TreeSet(Comparator<? super E> comparator)
复制代码
是TreeSet的一个构造函数

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



作者: Nemo    时间: 2015-6-22 14:03
<? super E>是不是就是说这个接口可以接收的是处理E和E的父类的接口对象、????
作者: 耀阳圣尊    时间: 2015-6-22 18:38
泛型是编译期检查的,只要引用类型绝对匹配就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
希望我的回答能够帮助到您。您对我的回答是否感到满意呢?如果满意的话,请回复一下非常感谢!

作者: 陌上桑    时间: 2015-6-22 22:20
  E是Student ,     
         TreeSet<Student> t1 = new TreeSet<Student>(new Comp());
作者: 陌上桑    时间: 2015-6-22 22:28
少写一点:
        TreeSet<E>(Comparator<? super E> comparator)
   类 TreeSet<E>,E是set集合操作的内容 ,  与形参是不同的概念。
作者: Nemo    时间: 2015-6-23 09:26
耀阳圣尊 发表于 2015-6-22 18:38
泛型是编译期检查的,只要引用类型绝对匹配就ok,至于里面是否是子类型,那是运行时检查的,所以可以操作子 ...

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

拜托,你去看清楚再来回答问题啊。。。。。。<? super E>是下限,因为它时限定了最子类,所以叫下限,<? extends E>是上限,因为它限定了最父类
作者: 改变    时间: 2015-6-23 09:48
Nemo 发表于 2015-6-23 09:42
拜托,你去看清楚再来回答问题啊。。。。。。

抱歉,我的错。
作者: 耀阳圣尊    时间: 2015-6-24 09:03
Nemo 发表于 2015-6-23 09:26
就是说比如我定义TreeSet中存储的引用数据类型为Student,那么是不是就是说可以接收的构造器得是处理Stud ...

也可以这么理解。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2