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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏伯亚 中级黑马   /  2014-4-7 10:39  /  1652 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天复习泛型想起的一个疑问。我们知道? extends E:可以接受E类型或者E的子类型对象。具体代码是这个
ArrayList<? extends Object> a1=new ArrayList<String>();
a1.add("aa");
第二句代码是错的。我知道集合具体对象既可以存储String,也可以存储Object的其他子类,所以添加具体
的类型对象不合适,类型检查会出现安全问题。
? extends Object代表Object的子类型不确定,不能添加具体类型的对象。但是这样我就有个疑问,不能添加具体对象,
那能够添加什么对象呢?Object类对象是不是也不行?求理解透彻的大神给解答。

还有public static void method(ArrayList<? extends Object>a1){
a1.add("abc");
这第二句也是错的,因为具体类型的方法不确定,所以不能调用具体子类型的方法,既然这样又何必限定泛型上限呢?
这也是有点疑问。求解答

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 caijunsong 于 2014-4-7 13:53 编辑

首先我们看第一个
ArrayList<? extends Object> a1=new ArrayList<String>();
a1.add("aa");
我们现在是先编译  是在编译中报错的 !记住 现在是编译期,a1被定义为一个可以接受Object未知子类类型的集合
而元素的类型并不明确,Object的子类很多啊 ,你并不知道是哪个,
而你现在直接扔了一个String类型进去,它当然报错啦  因为在扔之前你并没有在编译器就明确告诉它   a1集合的元素就是String

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
泛型从1.5出来后,泛型需要指定集合中存放的对象

ArrayList<String> a1=new ArrayList<String>();
a1.add("aa");
回复 使用道具 举报
ArrayList<? extends Object> a1=new ArrayList<String>();
这是肯定不行的,定义泛型左右类型是要一致的!

泛型是为了将一些运行可能出现的错误,让它在编译时产生,以便解决!

限定了父类,就代表你要添加的对象肯定具备父类的方法,在遍历集合时候一般都会使用父类的方法来对元素进行操作,如果没有定义泛型,在你遍历集合,想要操作元素时,你需要将元素类型进行强转回原来的类型,这时候就有可能发生异常!
定义了泛型,在遍历,操作元素时,就可以不进行强转的操作,直接使用元素类的方法来操作类型! 如果你在往集合中添加时,添加的的元素类型和你定义的泛型不匹配,在编译时就会报错,就不会产生运行时的异常!

你可能还没理解泛型的真正用处,可以再看一下毕老师的视频,讲的挺好的!

说的不对,多多指教,互相学习!

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马