- 1、本文档共90页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
public static void main(String[] args) { ClassTypeCaptureBuilding ctt1 = new ClassTypeCaptureBuilding (Building.class); System.out.println(ctt1.f(new Building())); System.out.println(ctt1.f(new House())); ClassTypeCaptureHouse ctt2 = new ClassTypeCaptureHouse (House.class); System.out.println(ctt2.f(new Building())); System.out.println(ctt2.f(new House())); } } 输出结果:true、true、false、true ★ 分析: ◆ 该示例的执行过程与前面ArrayMaker.java类似 ◆ 关键之一:注意分析泛型是如何被擦除的? ◆ 关键之二:类型标签是如何发挥出作用的? 八、擦除的补偿 2、 创建类型实例 ★ 分析:前面的Erased.java程序 ◆ 创建一个new T()的尝试将无法实现 1、在Java中无法实现的原因 ★ 一部分原因是因为:擦除 ◆ 而另一部分原因是因为:编译器没有能力验证, 类型T是否具有默认(无参)构造器 2、在C++中可以实现的原因 ★ 效果:这种操作很自然、很直观、并且很安全 ◆ 原因:在C++中,类型是在编译期受到检查的 ◆ 典例:参阅课本P381 3、Java的解决方案:了解内容 ⑴ 第一种方案:传递一个工厂对象,并使用它来 创建新的实例 ⑵ 第二种方案:模版方法设计模式 八、擦除的补偿 3、 泛型数组 ★ 原则:Java不能创建泛型数组 ◆ 替代的解决方案:在任何想要创建泛型 数组的地方都使用ArrayList 1、典例分析: ★ 参阅课本P383 ◆ 该程序实质上是对FilledListMaker.java的提炼 ◆ 在这里你将获得数组的行为,以及由泛型提供 的编译期的类型安全 public class ListOfGenericsT { private ListT array = new ArrayListT(); public void add(T item) { array.add(item);} public T get(int index) { return array.get(index);} } ★ 归纳: ◆ 本示例给出了:使用ArrayList创建泛型数组的 标准程序 ◆ 绝大多数的程序员都喜欢采用这种方式来创建 泛型数组 2、问题的提出 ★ 可是,如果我们并不想使用ArrayList容器 ◆ 但是又希望创建出一个泛型类型的数组,那么 该怎么办呢? 3、解决思路之一: ★ 既然所有数组无论它们持有的类型如何,都具有 相同的结构(数组的槽位尺寸和数组的布局) ◆ 那么,我们能不能先创建一个Object数组, 然后 再将其转型为所希望的数组类型? ◆ 实践证明:可以编译,但不能运行 ★ 典例分析:P383~384 class GenericT {} public class ArrayOfGeneric { static final int SIZE = 100; static GenericInteger[] gia; ★ 声明一个指向数组的引用gia ◆ 该数组的元素类型为:GenericInteger ★ GenericInteger将被擦除为原生类型Generic ◆ 为了实现类型安全,编译器将保证:在数组中 能够存取的数据类型一定是GenericInteger @SuppressWarnings(“unchecked”) public static void main(String[] args) { // gia = (GenericInteger [])
文档评论(0)