网站大量收购闲置独家精品文档,联系QQ:2885784924

Java集合与泛型(07).ppt

  1. 1、本文档共83页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 类型通配符 泛型中的extends ListInteger list1 = new ArrayListInteger(); list1.add(new Integer(88)); List? list2 = list1; System.out.println(list2.get(0)); ListInteger list1 = new ArrayListInteger(); list1.add(new Integer(88)); List? list2 = list1; list2.add(new Integer(99)); * 类型通配符 泛型中的extends 在用List?类型定义的变量中,只可以从中检索元素,而不能增加元素。 在代码片段1中,对于 list2,编译器并不知道List?的类型参数的值,但是编译器可以进行一些简单的类型推理,编译器推断未知的类型参数必须扩展Object,所以编译器允许调用get()方法并推断其返回类型为Object。 而在代码片段2中,对于list2,编译器不能对List?的类型参数作出足够严密的推理,以确定将Integer 传递给List?类型对象的add()方法是类型安全的,所以编译器将不允许这么做,因此编译无法通过。 擦除与泛型规则 擦除 泛型的实现使用了“擦除”机制。擦除(Erasure)是指在泛型代码内部,参数类型将转换为Object等其他类型,因此只能调用Object等类的方法,所有实例类型的相关信息都将消失。 擦除的本质是泛型参数类型以其父类代替,如String、Integer、Double等预定义类型和自定义类型都变成了Object类型。实际上在使用的时候还是进行了带强制类型的转化,只不过这是比较安全的类型转换,因为在编译阶段已经确保了数据类型的一致性。 Java之所以采取擦除的策略主要目的是为了兼容Java SE 1.5以前的应用。 擦除与泛型规则 擦除 泛型擦除的基本原则如下: (1) 所有泛型化的集合类都被擦除成非泛型化的:如ListE、ListListE都被擦除成List; (2) 所有泛型化数组都被擦除成非泛型化的数组:如ListE[],被擦除成List[]; (3) 非泛型化的集合类,将被擦除成其自身:如List 被擦除成List; (4) 原生类型将擦除成它们自身:如String被擦除成String; (5) 无限制的参数类型E,被擦除成Object; (6) 所有带约束限制的参数如? Extends E、X extends E都被擦除成E; (7) 如果有多个约束类型,将擦除成第一个:如T extends Object E,则擦除成Object。 擦除与泛型规则 擦除 ListString listStr = new ArrayListString(); listStr.add(Hello ); listStr.add(Java); String str = listStr.get(0) + listStr.get(1); List listStr = new ArrayList(); listStr.add(Hello ); listStr.add(Java); String str = (String)listStr.get(0) + (String)listStr.get(1); 擦除与泛型规则 擦除 public class GenericErasureT { private T obj; public GenericErasure(T obj) { this.obj=obj; } ……} public class GenericErasure{ private Object obj; public GenericErasure(Object obj) { this.obj=obj; } ……} 擦除与泛型规则 泛型规则 泛型规则 : (1) 泛型的类型参数可以是类或接口(包括自定义类); (2) 同一种泛型可以对应多个版本(因为具体类型是不确定的),不同版本的泛型类实例是不兼容的,如List类可以有ListInteger、ListString、ListObject等版本,但是它们的实例不能进行强制转换; (3) 泛型的类型参数可以有多个,如可以定义形式如ClassNameA,B,C的泛型类; (4) 泛型的类型参数可以使用extends关键字,例如ClassNameT extends superclass,习惯上称之为“有界类型”; (5) 泛型的参数类型还可以是通配符类型

文档评论(0)

好文精选 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档