Java编程思想第十五章泛型ppt课件.ppt

Java编程思想第十五章泛型ppt课件.ppt

ID:58883044

大小:154.50 KB

页数:90页

时间:2020-09-30

Java编程思想第十五章泛型ppt课件.ppt_第1页
Java编程思想第十五章泛型ppt课件.ppt_第2页
Java编程思想第十五章泛型ppt课件.ppt_第3页
Java编程思想第十五章泛型ppt课件.ppt_第4页
Java编程思想第十五章泛型ppt课件.ppt_第5页
资源描述:

《Java编程思想第十五章泛型ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第十五章泛型★泛型★擦除★边界七、擦除的神秘之处7、迁移兼容性★我们下面来分析:◆为什么Java需要使用擦除来实现泛型?1、Java语言诞生时,并未采用泛型机制⑴如果在最初的版本中,泛型就已经是Java语法的一部分★Java没有丝毫理由不采取,与C++类模板一致的处理机制:利用编译器充分获取类型参数的信息,并在此基础上顺利执行各种操作⑵然而直到JavaSE5,Sun才宣布支持泛型机制★为了实现从非泛型到泛型的迁移,Java不得不使用擦除来实现泛型◆为了实现从C到C++的迁移,C++牺牲了什么?⑶在基于擦除的实现当中,泛型类型只有在静态类型检查期间才起作用★在此之后,程序中的所有泛型

2、类型都将被擦除,并且替换为它们的非泛型上界◆例如:TextendsHasF将被擦除为HasF2、迁移兼容性和向后兼容性⑴Java需要支持迁移兼容性:★使得原先非泛型类库能够迁移并升级为泛型类库◆并且当某个非泛型类库升级为泛型类库时,不会对依赖于它的代码和应用程序造成破坏⑵Java还需要支持向后兼容性:★现有的,基于原先非泛型类库的,代码和类文件仍旧合法,并且应该继续保持其之前的含义◆为了保证两种兼容性:Java修改了编译器◆出于商业角度的考虑:没有修改虚拟机的指令集3、为什么要迁移?★若没有某种从非泛型类库到泛型类库的迁移方式◆所有的已经构建了很长时间的类库,就不得不同希望使用Ja

3、va泛型的开发者们说再见了★但是,这些类库是众多优秀的Java设计人员经过长时间耕耘积累下来的结晶,里面有着大量程序开发人员所依赖的重要工具◆因此,舍弃这些类库并不是一种可以接受的代价◆所以,问题的关键不在于要不要迁移,而是在于擦除是否是最佳的或者唯一的迁移方式七、擦除的神秘之处8、擦除的问题★擦除的作用:保持两个兼容性★擦除的代价:显著1、擦除带来的问题之一:运行时类型⑴根据基本原则,泛型不能使用在这样的操作之中★该操作显式引用(直接使用)运行时类型◆例如:转型、instanceof操作和new表达式⑵分析:★在运行时,所有的有关参数的类型信息都丢失了◆无论何时,当你在编写泛型代

4、码时,都必须时刻提醒自己,你仅仅只是看起来好像拥有有关参数的类型信息而已2、基本概念:原生类型(Rawtype)★这又是一个令人沮丧的概念★Raw:天然的、未加工过的、粗犷的◆Rawtype经过升级以后变成Generictype⑴原生类型的概念★归纳:没有使用泛型,或者没有升级为泛型的类型,称为原生泛型◆典例:List的原生类型就是ListList的原生类型也是List⑵原生类型的本质★经过擦除以后的泛型常常就是原生类型◆因为:普通的泛型参数将会被擦除为Object,而众多原生类型的底层表示就是使用Object◆但也有例外存在,毕竟这是两个不同的概

5、念⑶原生类型的作用★保证迁移之前的Java代码仍然能够运行◆例如:List类在JavaSE5之前就已经存在,只是后来被升级为泛型List◆为了保持向后兼容,Java仍然支持之前的List类⑷原生类型的典例★将不同类型的对象,存储到原生类型的List中:Listl=newArrayList();l.add(“hello”);l.add(newInteger(123));◆原生类型不能保证类型安全3、擦除带来的问题之二:代码混用★代码混用指:泛型代码与非泛型代码的混合使用★尽管你或者Java定义了泛型类,然而你并不需要在使用它们的时候,必须指明泛型参数◆典例:P376~3774、

6、分析:Derived2类的代码★ClassDerived2extendsGenericBase◆表明:Derived2继承自GenericBase◆但是请注意:后者并没有任何的泛型参数,而且编译器也不会发出任何警告⑴课本有点问题:★在调试程序的过程中你将会发现,其实编译器在这个地方是要发出警告的◆警告:建议你不要使用原生类型,而是使用泛型◆原因:原生类型并不安全⑵疑问:★我们并没有定义GenericBase,为什么可以使用它◆原因:在生成字节码之前,GenericBase类将被擦除为非泛型,即原生类型GenericBase◆换句话说,实际存储的就是GenericBase⑶结论

7、:★现有的非泛型代码可以继续工作◆你可以这样想象:泛型GenericBase类是后来才从非泛型类GenericBase升级的◆这样,擦除将导致泛型代码与非泛型代码的混用5、分析:ErasureAndInheritance类的代码⑴Objectobj=d2.get();★正确:◆原因:安全的向上转型为Object类型⑵d2.set(obj);★警告:建议你不要使用原生类型,而是使用泛型◆分析:编译器不能确定,被增加到d2中的值是否有正确的类型,所以只好发出一条警告

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。