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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不灬语 初级黑马   /  2016-9-6 23:33  /  378 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如有个方法 add( ArrayList<Person> list){ }为什么调用的时候,add(ArrayList<Student> list> 为什么不可以呢?  不算父类引用指向子类对象吗


8 个回复

倒序浏览
在这里父类引用指向子类对象应该是这样
        add( List<Person> list)    假设这是父类引用,那么子类的应该是add(ArrayList<Person> list)而不是指泛型.
是指ArrayList是List的子类.
至于你上面的为什么不行,假设如果我要创建一个泛型为Person的ArrayList对象:
       ArrayList<Person> list = new ArrrayList<Person>(); 这里有个要求你记得么吗兄弟?后面的泛型类型要和前面的一致或者你可以不写.你上面的意思是这样
    ArrayList<Person> list = new ArrrayList<Studnet>();
具体怎么解释我也不太懂,水平有限,但是我知道这是与泛型擦除有关的,泛型只在编译时期是有效的.实际上编译后虚拟机会将泛型擦除,底层用的全都是Object对象.

回复 使用道具 举报
首先,你的Student是Person的子类吗,其次,前面那个方法没有上限限定,可以改成 add(ArrayList<? extends Person>){}
回复 使用道具 举报
这个涉及到泛型通配符的问题
回复 使用道具 举报
这是需要用到通配符,add( ArrayLIst<? super Person> list),这样应该可以得,
回复 使用道具 举报
泛型的使用是不支持多态
回复 使用道具 举报
应该要用<?super    >
回复 使用道具 举报
HARRY_yFd0S 来自手机 中级黑马 2016-9-7 09:10:29
8#
阔以啊。你的add的泛型里写person实际上只是一个名字而言,它可以用任何类代替
回复 使用道具 举报
LShu 中级黑马 2016-9-7 10:44:53
9#
这个应该是属于多态的一个好处,以父类作为形式参数传递,方法可以接收任何子类对象.但是这个前提是有继承关系的.不知客官你的Student和Person是否存在继承的关系呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马