黑马程序员技术交流社区

标题: 泛型上下线 [打印本页]

作者: 毛标    时间: 2012-8-19 21:49
标题: 泛型上下线
回头在看泛型总感觉很难明白,不知道使用上下限的方法
、<? extends Number> 只允许泛型为Number及Number子类的引用调用
、<? super Number> 只允许泛型为Number及Number父类的引用调用
想上面这样说的,我可以理解为存在这么一种情况就是这个Number定义了之后可以吧这2句实现成1个?
作者: 李知伦    时间: 2012-8-20 08:00
本帖最后由 李知伦 于 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.     }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2