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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄嘉慧 初级黑马   /  2012-4-9 19:20  /  1918 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当一个方法的形式参数类型是Person时,
打个比方: public void show(Person p){}
由于java的多态特性, 这时可以传入Student类型的参数. (Student为Person子类)

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

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

希望知道朋友们能帮忙举个例子解释一下.(但希望不要弄出来一大堆少见的专业术语, 小生还很菜......谢谢)

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

6 个回复

倒序浏览

回帖奖励 +2

因为你的泛型声明的不对!这样声明:public static void printColl(ArrayList<? extends  Person> al){}
这样就意思是Person和他的子类都可以被操作了!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报

回帖奖励 +2

你泛型定义的有问题, public static void printColl(ArrayList< Person> al){}  这个你定义传入的参数的类型是Person    而你传入的参数是 Student   类型不一样     所以错误....

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报

回帖奖励 +2

public void show(Person p){}和public static void printColl(ArrayList< Person> al){}不是一回事,前面的的确可以根据多态传入子类对象,但后面的是泛型,ArrayList< Person>是表明传入的ArrayList中的元素必须是Person类型的,那么传入ArrayList<Student>必然不行,你改为ArrayList< ? extends Person> al就可以了,至于为什么,楼上也说了,我就不重复了

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
adison 发表于 2012-4-9 19:38
public void show(Person p){}和public static void printColl(ArrayList< Person> al){}不是一回事,前面 ...

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

但还是感觉有点难理解。

总的来说,就是泛型不能使用多态?但为什么?
回复 使用道具 举报
黄嘉慧 发表于 2012-4-10 15:41
许是我没把问题说清楚。我也知道泛型的限定,但只有你比较准确地回答了我的问题。

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

多态是子父类或者实现接口之间的关系,但泛型是一种特殊的类型,你也可以理解为它告诉编译器传入的参数该是什么类型,从而避免了类型强转的麻烦,多态和泛型根本是两码事,但这仅仅是泛型的一点皮毛知识而已,关于多态的知识更不是一两句话就能说清的,有很多东西可以深究,我现在也不是很懂
回复 使用道具 举报
感谢喽上各位特别是adison的回答.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马