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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hyace 中级黑马   /  2014-4-2 22:49  /  1576 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hyace 于 2014-4-6 15:46 编辑

看毕老师的视频的时候,明白什么是上限什么是下限,但是不明白为什么存元素就要用上限,取元素就要用下限,为什么addAll()就要用上限,实现Comparetor接口就要用下限?谢谢。

5 个回复

倒序浏览
这个要比较起来说明的,设置你所谓的上限下限是在参数声明的时候,其他情况不行
1 首先确定的泛型在new时只能new确定的泛型,且其可以使用add方法添加此类型和其子类的实例
2 如上面说的,这样类型就被定义的死死的,不利于多态,所以才有了<? extends Xxx>这种形式,表示list可以为泛型Xxx或者Xxx的子类型,但是这样也有弊端,就是你不能再用add方法,换句话说这样的泛型只能用来做参数传递读取里面的值,无法添加。
3 那么我还想add怎么办,于是有了<? super Xxx>的形式,这样在作为参数传递时候可以传递Xxx以及Xxx父类型的list进来,但是add只能是Xxx或者Xxx的子类(这个到哪都一样,没什么可说的),至于具体怎么用看你的需求了
4 List<?> 任何类型可以传递进来,但不能再add
5 List<Object> 只能是类型<Object>,可以add
6 <?>和<? extends Object>意义相同

Comparator用super的原因是
第一,有些类的比较规则是在它的父类定义的,
第二,java不让父类和子类实现类型参数不同的相同的接口

以List<? super Person> list为例,它可以接收List<Object>、List<Person>,但不能接收List<Student>。

当你想访问list的内容时,如list.get(0),你只能用Object来接收返回值,(因为不能确定list的上限,只能用最上限的Object)。这个用处不是很大,因为你其实不能做什么,除非用强制类型转换。

但是反回来,如果你想往list内加入一个元素,你知道它的下限是Person,所以你可以加Person或者其子类元素,但不能加一个Object元素。

而用List<? extends Person> list2,添加元素这块儿,你就不能往list2里面加元素,因为你不清楚这个list的类型下限在哪儿,所以没法加。
回复 使用道具 举报
Engle 发表于 2014-4-3 08:47
这个要比较起来说明的,设置你所谓的上限下限是在参数声明的时候,其他情况不行
1 首先确定的泛型在new时只 ...

你的意思好像是用上限(<?extends E>)时候不能添加只能读取?但是毕老师那意思好像是,添加用上限,读取用下限。。。。
回复 使用道具 举报
楼上的回答的好专业 没补充
回复 使用道具 举报
我没看毕老师的视频,但我想你肯定是理解错了。
用上限(<?extends E>)时候,的确是不能添加的,因为你不清楚这个类型下限在哪儿,所以没法加。
编译的时候就会报异常,你可以自己写代码试试:(当然你可以add(null)不会报错,但这毫无意义对吗?)
回复 使用道具 举报
Engle 发表于 2014-4-3 09:46
我没看毕老师的视频,但我想你肯定是理解错了。
用上限(

我想是你理解错了,API里Collection的addAll就是用的上限
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马