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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lengmianluocha 中级黑马   /  2013-8-10 21:46  /  1201 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天毕老师关于泛型的视频,有个问题,阐述如下:
  1. import java.util.*;

  2. class Person {//定义一Person个类型
  3.         private String name;

  4.         Person(String name) {
  5.                 this.name = name;
  6.         }

  7.         public String getName() {
  8.                 return name;
  9.         }

  10. }

  11. class Student4 extends Person //Student4继承Person
  12. {
  13.         Student4(String name) {
  14.                 super(name);
  15.         }
  16. }

  17. public class GenernicDemo4 {

  18.         public static void main(String[] args) {
  19.                 // TODO Auto-generated method stub
  20.                 ArrayList<Student4> al = new ArrayList<Student4>();//新建一个Student4的ArrayList,并添加数据
  21.                 al.add( new Student4("abc1"));
  22.                 al.add(new Student4("abc2"));
  23.                
  24.                 ArrayList<Person> al1 = new ArrayList<Person>();//新建一个Person的ArrayList,并添加数据
  25.                 al1.add( new Person("abc3"));
  26.                 al1.add( new Person("abc4"));
  27.                
  28.                 printColl1(al1);//调用printColl1方法
  29.                 printColl1(al);
  30.                 }
  31.        
  32. <blockquote>public static void printColl1(ArrayList<? extends Person> al)//定义printColl1方法,用于打印传入ArrayList中的数据
复制代码
当我将printColl1中的参数换成“ArrayList<? super Student4> al”,时,此时的it.next()无法调用Person类中的getName()方法,代码如下:
  1. public static void printColl1(ArrayList<? super Student4> al)//定义printColl1方法,用于打印传入ArrayList中的数据
  2.                 {
  3.                         Iterator<? super Student4> it = al.iterator();
  4.                         while(it.hasNext())
  5.                         {
  6.                                 System.out.println(it.next());<u><font color="#ff0000">//此出无法调用<span style="background-color: rgb(255, 255, 255);">Person类中的getName()方法</span></font></u>
  7.                         }
  8.                 }
复制代码
我的问题是,泛型的上限、下限,是不是有要求,比如此题中,写成ArrayList<? super Student4> al就不可以调用Person类中的getName()方法,而写成ArrayList<? extends Person> al就可以呢?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
ArrayList<? super Student4>   student4 或者 student4父类型 所以 存进去应该类型提升至Object  所以你不能调用getname
ArrayList<? extends Person>  存进去 类型最高就是person  只能是person或者person的子类 所以可以调用getname

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
你这个应该是ArrayList<? extends Student4> al 不能正确运行,因为ArrayList 所持有的对象类型上限为Student4,但是他不知道具体持有的对象类型,编译错误 原因: 无法通过方法调用转换将实际参数ArrayList<Person>转换为ArrayList<? extends
Student4>

ArrayList<? super Student4> al 可以正确执行 //所持有对象为Student4 的超类,下限为Student4  ,知道具体持有的对象类型




点评

解答好像不怎准确  发表于 2013-8-11 00:21

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
我想这跟父类不能使用子类的特有方法相类似。
因为ArrayList<? super Student4> 接收的是Student4自己或其父类,同时其父类的父类也可以被接收。
而Person类默认的父类是Object,这样一个存储Object对象的集合,也可以使用printColl1这个方法,
这里说Object感觉变扭,我们就假设Person的父类是生物类,那么一个存有生物类对象的ArrayList集合也可以使用这个方法,但是这个生物类对象不一定有getName这个方法,
所以用it.next().getName()就不行了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马