黑马程序员技术交流社区
标题:
关于泛型上下限的疑问
[打印本页]
作者:
苏伯亚
时间:
2014-4-7 10:39
标题:
关于泛型上下限的疑问
今天复习泛型想起的一个疑问。我们知道? 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");
这第二句也是错的,因为具体类型的方法不确定,所以不能调用具体子类型的方法,既然这样又何必限定泛型上限呢?
这也是有点疑问。求解答
作者:
caijunsong
时间:
2014-4-7 13:34
本帖最后由 caijunsong 于 2014-4-7 13:53 编辑
首先我们看第一个
ArrayList<? extends Object> a1=new ArrayList<String>();
a1.add("aa");
我们现在是先编译 是在编译中报错的 !记住 现在是编译期,a1被定义为一个可以接受Object未知子类类型的集合
而元素的类型并不明确,Object的子类很多啊 ,你并不知道是哪个,
而你现在直接扔了一个String类型进去,它当然报错啦 因为在扔之前你并没有在编译器就明确告诉它 a1集合的元素就是String
作者:
宋丹
时间:
2014-4-7 22:28
泛型从1.5出来后,泛型需要指定集合中存放的对象
ArrayList<String> a1=new ArrayList<String>();
a1.add("aa");
作者:
jingdou56
时间:
2014-4-8 00:27
ArrayList<? extends Object> a1=new ArrayList<String>();
这是肯定不行的,定义泛型左右类型是要一致的!
泛型是为了将一些运行可能出现的错误,让它在编译时产生,以便解决!
限定了父类,就代表你要添加的对象肯定具备父类的方法,在遍历集合时候一般都会使用父类的方法来对元素进行操作,如果没有定义泛型,在你遍历集合,想要操作元素时,你需要将元素类型进行强转回原来的类型,这时候就有可能发生异常!
定义了泛型,在遍历,操作元素时,就可以不进行强转的操作,直接使用元素类的方法来操作类型! 如果你在往集合中添加时,添加的的元素类型和你定义的泛型不匹配,在编译时就会报错,就不会产生运行时的异常!
你可能还没理解泛型的真正用处,可以再看一下毕老师的视频,讲的挺好的!
说的不对,多多指教,互相学习!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2