黑马程序员技术交流社区
标题:
泛型问题!!
[打印本页]
作者:
茶念小手
时间:
2013-8-11 09:25
标题:
泛型问题!!
本帖最后由 茶念小手 于 2013-8-14 21:21 编辑
public static void printColl(TreeSet<? extends Person> al)
{
Iterator<? extends Person> it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
}
复制代码
在此处getName()是Student继承的Person中的方法。不上示方法参数(TreeSet<? extends Person> al ) 变成了(TreeSet<? super Student> al)后,就会因为调用getName()方法而报错,难道泛型不能调用父类方法?
作者:
⑷嚸V恱
时间:
2013-8-11 09:48
把代码 在详细的贴出来,是可以调用父类的方法的
作者:
xscn
时间:
2013-8-11 10:09
本帖最后由 xscn 于 2013-8-11 10:12 编辑
TreeSet<? extends Person> al这句话表示该TreeSet对象中只能够装Person对象以及Person的子类,getName()是Person中的方法,子类继承了Person当然能够使用getName()这个方法。编译当然没问题。
而改为TreeSet<? super Student> al,这代表TreeSet中只能装Student或他的父类的对象,Student对象和Person对象能够使用getName()这个方法,但是Person的父类就不能保证能使用这个方法吧,只指定了下限,没有指定上限,往上能追溯到Object呢,Object不一定有这个方法了吧。
作者:
清心玉质
时间:
2013-8-11 15:58
受到上一帖的启发,我仔细琢磨了一下:
TreeSet<? extends Person> 表示treeSet可以接收Person及Person的子类型,Student继承了父类,自然就有getName方法。
TreeSet<? super Student>表示treeSet可以接收Student及Student的父类,Student的所有父类不是都有getName方法,无法识别。
如果想使用<? super Student>实现getName方法,可以转换类型,代码如下:
public static void print(ArrayList<? super Student> al){
Iterator<? super Student> it = (Iterator) al.iterator();
while(it.hasNext())
{
System.out.println(( (Person) it.next()).getName());
}
作者:
以防万一
时间:
2013-8-13 22:17
亲,如问题已解决请将分类的未解决改为已解决。
以后的问题贴也要及时更改分类哦~
保持队形,谢谢合作
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2