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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 覃宏海 中级黑马   /  2012-9-12 22:50  /  2660 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 覃宏海 于 2012-9-13 15:52 编辑

新人求教
对于泛型的下限<? super E>我很难理解
如果A extends B,那么B在有A的方法的同时A还有它自己特有的方法
那么如果原来泛型为<A>,改成<B>后,不就不能用A的方法了吗?

是不是我对泛型的理解错误了?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
对于泛型的下限<? super E>我很难理解
这句话的意思是,该类型必须是E或者E的父类
父类B可以有自己的方法,子类A可以重写父类的方法,但是父类不能调用子类的方法
回复 使用道具 举报
本帖最后由 张飞年 于 2012-9-13 00:21 编辑

<? super E> 这是泛型的下限,也就是说对象的类型只接收E类型或者是E类型的父类类型,这里的?为通配符。下限通常在对集合中的元素进行取出操作时进行使用。
A extends B,如果泛型是<A >则能使用的方法是A自己的和继承的方法,<B>只能使用自己的方法,这没错,我们想清楚的是泛型是一种对数据类型的限制,是为了保证数据的安全操作,避免一些不必要的错误,如转换异常之类的。上限一般在存储元素的时候使用,因为这样取出都 是按照上限类型来运算的,不会出现类型安全隐患。
关于泛型的理解,暂时可以这样理解:
泛型是一种限制和检查类、方法、成员变量的数据类型的“泛泛而说的类型,相当于类型的占位符,只告诉编译器说:这里方的是一个类型,具体什么类型编译或执行的时候再自动确定吧。就是这样~~举例说明吧:
       人  ren=new  人();
不加泛型时什么样的人都可以。
         人<明星类型的人>   ren=new  人<明星类型的人>();
加了泛型就是说我只要new一个明星类型的人类。
  1. //泛型的重点是类型检查,如在以前的ArrayList中可以放入所有对象而不会进行类型检查,所以
  2. //当下面代码时会有错
  3. ArrayList list=new ArrayList();
  4. Apple a=new Apple();
  5. Orange o=new Orange();
  6. list.add(a);list.add(o);
  7. //当通过list.get(int index)来获取对象时,它返回的是一个Object的对象。你要进行相应的类型判断才能正确使用这个通过get返回的对象。

  8. //而泛型的好处在于,在add()方法的时候就进行了类型的检查
  9. //如
  10. ArrayList<Apple> list=new ArrayList<Apple>();
  11. Apple a=new Apple();
  12. Orange o=new Orange();
  13. //当list.add(a)时没问题,而list.add(o)的时候就会报错了。

  14. //这是泛型的一个好处,另外一个好处就是简化代码
  15. //如方法 T do(T test);中do方法能适用于大部分的数据类型。
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马