欢迎来到 IT实训基地-南通科迅教育
咨询电话:0513-81107100
Java基础篇:泛型之泛型参数
2014/7/2
科讯教育
795
南通IT培训精讲班怎样选择
泛型机制常用的参数有3个:
  “?”代表任意类型。如果只指定了,而没有extends,则默认是允许任意类。
  extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类。
  super关键字声明了类型的下界,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object
  前提
  Fruit是Apple和Orange的超类。
  本章通过Java代码逐一分析泛型参数的意义和区别
  extends参数:
  [Java]?
  publicvoidextend(Listlist,Fruitfruit){??
  ????Fruitnow=list.get(0);??
  ????System.out.println("now==>"+now);?
  ??//??Applea=list.get(0);?无法通过编译?
  ????Objecto=list.get(0);??
  ????System.out.println(o);?
  ????//list.add(fruit);//这句话无法编译???
  ????//list.add(newObject());?//无法通过编译?
  ????list.add(null);//这句可以编译,因为null没有类型信息??
  ??}??
  在上面的例子中,可以明确从list中取得的记录一定是Fruit,但是无法确定是Apple,list除了传入null外,不能添加其他任何参数;分析原因前先看以下的例子:
  [Java]?
  publicvoidtestExtendType(){?
  ??Listlist=newArrayList();?
  ??Listlist2=newArrayList();?
  ??Listlist3=newArrayList();?
  ??extend(list2,newApple());?
  }?
  从以上代码可以看出:
  extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类,List可以指向ArrayList()、ArrayList()、ArrayList()等。现在如果传入的参数list为newArrayList(),则此时你向此list中添加Fruit,则肯定报错。而读取数据时,不管list是什么类型,读取的数据肯定都是Fruit,同时Fruit也是Object。
  通过以上的分析,知道直接往继承extends中的列表中添加记录是不行的,那么如何向extends修饰的list中添加记录,可以使用泛型方法来达到目的:
  [Java]?
  publicvoidextendType2(Listlist,Tdate){??
  ????list.add(date);??
  ??}??
  调用示例如下:
  [Java]?
  publicvoidtestExtendType2(){??
  ????Listlist=newArrayList();??
  ????extendType2(list,newApple());??
  ??}?
  super参数
  super用的不多,只简单介绍一下。
  [Java]?
  publicvoidsuperType(Listlist,Appleapple){??
  ????Objecto=list.get(0);?
  ????System.out.println(o);?
  ??//?Applea=list.get(0);//不能编译?
  ??????
  ???//Appleapple=list.get(0);//不能编译??
  ????list.add(apple);?
  //???list.add(newObject());?//不能编译?
  //???list.add(newFruit());?//不能编译?
  ??}??
  在以上代码中,从list中读取的记录无法确定是任何类型(除Object),list除了添加Apple外,不能添加任何类型的对象(包括Object)。分析原因前先看以下代码:
  [Java]?
  publicvoidtestSuperType(){??
  ??Listlist=newArrayList();??
  ??Listlist2=newArrayList();??
  ??superType(list2,newApple());??
  }?
  super关键字声明了类型的下界,表示参数化的类型是所指定的类型,或者是此类型的父类型,直至Object。List可以引用?List,也可以引用List,所以无法保证list中都是Apple,但是可以保证,所有list引用的都是Apple的父类,所有向此列表中添加Apple是没有问题的,而很显然你向List、List中添加Object、Fruit对象,肯定失败,只能够添加Apple。
  ?参数
  “?”代表任意类型。?可以看做?extendsObject的缩写。
  [Java]? 
  publicvoidwideCardType(Listlist,Fruitfruit){?
  ??Objecto=list.get(0);?
  ??System.out.println(list.get(0));?
  ??//?list.add(fruit);?//不能编译?
  ??//?list.add(newObject());//不能被编译?
  }?
  [Java]?
  publicvoidtestWideCardType(){?
  ????/**?
  ?????*?可以看做?extendsObject的简化版?
  ?????*/?
  ????Listlist=newArrayList();?
  ????Listlist2=newArrayList();?
  ????Listlist3=newArrayList
  古人云:“授人以鱼,只供一饭之需;教人以渔,于终身受用无穷”。达内的Java培训正是秉承着这样教学理念。在Java培训期间,达内的老师不仅仅让学员们学到Java技能,同时通过亲身经历,来教导学员们如何成为一名合格的Java工程师。这正是众多企业偏爱达内Java学员的原因所在!
77
关闭
先学习,后交费申请表
每期5位名额
在线咨询
免费电话
QQ联系
先学习,后交费
TOP
您好,您想咨询哪门课程呢?
关于我们
机构简介
官方资讯
地理位置
联系我们
0513-91107100
周一至周六     8:30-21:00
微信扫我送教程
手机端访问
南通科迅教育信息咨询有限公司     苏ICP备15009282号     联系地址:江苏省南通市人民中路23-6号新亚大厦三楼             法律顾问:江苏瑞慈律师事务所     Copyright 2008-