黑马程序员技术交流社区

标题: 还是不太理解泛型的<? super E>。 [打印本页]

作者: 李哲    时间: 2012-3-29 17:42
标题: 还是不太理解泛型的<? super E>。
那个<?extends E:>还好理解。就视频里面说的类似多态,Person a=new Student();
但是<? super E>呢?难道仅仅是一种规定?规定下限?

不过,我想什么情况下用<? super E>,什么情况用<?extends E:>,API里面还是有不同的表明。不知道是基于什么理由?

<?extends E:>可以用多态解释
<? super E>呢?

TreeSet()的构造函数TreeSet(Comparator<? super E> comparator) 就使用<? super E>,我没搞明白。可能还是不太理解Comparator吧。


作者: 王国华    时间: 2012-3-29 17:54
这个也是多态的体现,比如你要给学生排序,那么你可以传入父类Comparator<Person>的比较器,这样这个比较器别的子类拿来也可以用,比较器里使用的方法要是父类中也有的方法
作者: 李涛涛    时间: 2012-3-29 17:55
<? super E>这种写法表明 将泛型的类型设定为E的超类。
TreeSet(Comparator<? super E> comparator),这个构造器告诉我们需要两个comparator类来进行比较两个元素。
如果 E是String类型,那么只要是String的父类都可以,比如Object,但是如果传Integer进去肯定是不行,? super E y就可以做这种限制,保证了构造器中的元素是可比较性的。
作者: 李哲    时间: 2012-3-29 17:58
我看教程里面的实例,和具体代码实现,两者都是多态体现,都是上限。不过这个也是符合道理的。只有多态可以解释。
作者: 李哲    时间: 2012-3-29 17:59
都是可以传入父类,子类也可以用。
作者: 李哲    时间: 2012-3-30 08:45
我有个想法,那就是实现接口,就用<?extends E:>
继承父类就用<? super E>
虽然两者都是传入父类,子类也可以用。但是<?extends E:>用于接口情况,<? super E>用于类




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