黑马程序员技术交流社区

标题: 问题: 当集合作为函数的参数时........ [打印本页]

作者: 黄嘉慧    时间: 2012-4-9 19:20
标题: 问题: 当集合作为函数的参数时........
当一个方法的形式参数类型是Person时,
打个比方: public void show(Person p){}
由于java的多态特性, 这时可以传入Student类型的参数. (Student为Person子类)

而当一个方法的形式参数类型是AyyayList<Person>:
如: public static void printColl(ArrayList< Person> al){}
这时传入ArrayList<Student>类型的参数,编译会失败.为什么?

毕老师讲课时举了个猪圈的例子很生动. 但关于其技术细节并不很具体.

希望知道朋友们能帮忙举个例子解释一下.(但希望不要弄出来一大堆少见的专业术语, 小生还很菜......谢谢)
作者: 胡元    时间: 2012-4-9 19:25
因为你的泛型声明的不对!这样声明:public static void printColl(ArrayList<? extends  Person> al){}
这样就意思是Person和他的子类都可以被操作了!
作者: 金兴    时间: 2012-4-9 19:34
你泛型定义的有问题, public static void printColl(ArrayList< Person> al){}  这个你定义传入的参数的类型是Person    而你传入的参数是 Student   类型不一样     所以错误....
作者: adison    时间: 2012-4-9 19:38
public void show(Person p){}和public static void printColl(ArrayList< Person> al){}不是一回事,前面的的确可以根据多态传入子类对象,但后面的是泛型,ArrayList< Person>是表明传入的ArrayList中的元素必须是Person类型的,那么传入ArrayList<Student>必然不行,你改为ArrayList< ? extends Person> al就可以了,至于为什么,楼上也说了,我就不重复了


作者: 黄嘉慧    时间: 2012-4-10 15:41
adison 发表于 2012-4-9 19:38
public void show(Person p){}和public static void printColl(ArrayList< Person> al){}不是一回事,前面 ...

许是我没把问题说清楚。我也知道泛型的限定,但只有你比较准确地回答了我的问题。

但还是感觉有点难理解。

总的来说,就是泛型不能使用多态?但为什么?

作者: adison    时间: 2012-4-10 20:17
黄嘉慧 发表于 2012-4-10 15:41
许是我没把问题说清楚。我也知道泛型的限定,但只有你比较准确地回答了我的问题。

但还是感觉有点难理解 ...

多态是子父类或者实现接口之间的关系,但泛型是一种特殊的类型,你也可以理解为它告诉编译器传入的参数该是什么类型,从而避免了类型强转的麻烦,多态和泛型根本是两码事,但这仅仅是泛型的一点皮毛知识而已,关于多态的知识更不是一两句话就能说清的,有很多东西可以深究,我现在也不是很懂

作者: 黄嘉慧    时间: 2012-4-17 18:27
感谢喽上各位特别是adison的回答.




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