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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 毛标 中级黑马   /  2012-8-19 21:49  /  1600 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

回头在看泛型总感觉很难明白,不知道使用上下限的方法
、<? extends Number> 只允许泛型为Number及Number子类的引用调用
、<? super Number> 只允许泛型为Number及Number父类的引用调用
想上面这样说的,我可以理解为存在这么一种情况就是这个Number定义了之后可以吧这2句实现成1个?

1 个回复

倒序浏览
本帖最后由 李知伦 于 2012-8-20 08:06 编辑
  1. //意思是只能调用,不能更改,希望代码能帮你理解
  2. import java.util.ArrayList;
  3. import java.util.List;

  4. class Toy {}
  5. class SubToy extends Toy{}
  6. class SubToy2 extends Toy{}


  7. public class main {

  8.     /**
  9.      * @param args
  10.      * @throws IllegalAccessException
  11.      * @throws InstantiationException
  12.      */
  13.     public static void main(String[] args) throws Exception{
  14.         Toy toy = new Toy();
  15.         SubToy subToy = new SubToy();
  16.         SubToy subToy2 = new SubToy();
  17.          
  18.         List<? extends Toy> list = new ArrayList<Toy>();//表示所持有对象是Toy子类
  19.         List<? extends Toy> list1 = new ArrayList<SubToy>();//表示所持有对象是Toy的子类
  20.          
  21. //      list.add(toy);      错误的 因为list所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型,
  22. //      list.add(subToy);   错误的,理由同上
  23. //      list.add(subToy2);  错误的,理由同上
  24.          
  25. //      list1.add(toy);         错误的 因为list1所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型,
  26. //      list1.add(subToy);   错误的,理由同上
  27. //      list1.add(subToy2);  错误的,理由同上
  28.          
  29.          
  30.          
  31.         List<? super Toy> list2 = new ArrayList<Toy>();//所持有对象为Toy的超类,下限为Toy,所以可以add() Toy及Toy的子类
  32.         list2.add(toy);
  33.         list2.add(subToy);
  34.         list2.add(subToy2);
  35.          
  36. //      List<? super Toy> list3 = new ArrayList<SubToy>();  错误的,所持有对象为Toy的超类,下限为Toy,
  37. //      所以不可以超过下限Toy,将ArrayList泛型指定为SubToy

  38.          
  39.         List<? super SubToy> list4 = new ArrayList<Toy>();//所持有对象为SubToy的超类,下限为SubToy ,
  40.                                                                 //可以将ArrayList泛型指定为Toy
  41. //      list4.add(toy); 错误的,因为虽然持有对象为SubToy的超类,但是容器不知道具体的类型是超类还是子类,所以不能放入超类,但是子类的话就可以的
  42.         list4.add(subToy);
  43.         list4.add(subToy2);
  44.          
  45.         List<? super SubToy> list5 = new ArrayList<SubToy>();//所持有对象为SubToy的超类,下限为SubToy ,
  46.         //可以将ArrayList泛型指定为SubToy      
  47. //      list5.add(toy); 错误的,理由同list4
  48.         list5.add(subToy);
  49.         list5.add(subToy2);
  50.          
  51. //      List<? super SubToy> list6 = new ArrayList<SubToy2>(); 错误的,所持有对象为SubToy的超类,下限为SubToy ,
  52. //      所以持有的对象可能为Toy,也可能为SubToy ,也就不能将具体的实现的泛型指定为SubToy2
  53.          
  54.          
  55.     }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马