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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李海鹏 中级黑马   /  2013-1-22 12:08  /  2083 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-23 10:42 编辑

我知道Integer是final类是不能继承的,但是在集合里ArrayList<? extends Integer>这样就可以,为什么呢?求详解

评分

参与人数 1黑马币 +12 收起 理由
舒远 + 12

查看全部评分

4 个回复

倒序浏览
我觉得可以这样理解:
1、首先加入泛型是为了限定集合中的操作类型,减少安全隐患,把运行期可能会出现的错误改到编译期,可是又限定的太严了,会增加代码的复杂性。
2、<?extends E>和<? super E>相当于对泛型进行了扩展。限定的不是那么严了、、、
3、对于这个E,只要是引用类型均可,当然也包括类似Integer这样的包装类,那么此时,如果E是普通的引用类型,当然没问题,只要是E的子类均可,对于Integer这样的,<? extends Integer>编译没问题,因为它不存在任何安全隐患啊、、你不可能找到Integer的子类,因此<? extends Integer>和<Integer>是等价的、、、(个人想法,欢迎批评指正!)

评分

参与人数 1技术分 +1 收起 理由
舒远 + 1 赞一个!

查看全部评分

回复 使用道具 举报
好像可以这么理解
回复 使用道具 举报
<?extends E>和<? super E>:前者是上限(本类和其子类),而后者则是下限(只能是他本类或其父类)
存元素时建议上限,去元素时建议下限
回复 使用道具 举报
针对这个问题我觉得还可以这么理解一下:
  list<? extends E>对于这个泛型的限定,它的意思可以理解为E这个类型,或者是E的子类的类型。这两个条件只要满足其中一个就可以了。
  但是在这里Integer没有子类,所以满足了第一个得条件。因此可以成立。与此同时:
  list<?super E>对于这个泛型的限定,它的意思可以理解为E这个类型,或者是E的父类的类型。这两个条件只要满足其中一个就可以了。
             这只是我的理解。希望能对你有帮助。
  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马