泛型擦除补偿

由于在使用泛型的时候,将会擦除类型参数,而只保留原始类型。所以在使用泛型时,我们不能使用new T(),也不能使用instanceof, 因为这两类操作要知道确切的类型。此问题的解决方案有三种(设计模式的使用):简单工厂(最简单),工厂方法(最灵活),模板方法(最简捷)。
1.简单工厂
在此方法中,将类型作为参数,以一个万能的工厂类(其中有一个返回具体类型类的实例的泛型方法)用类的newInstance()方法返回参数化类型的实例,如下所示:
这里写图片描述

优点:简单,直接使用泛型方法
缺点:
(1)单一使用Class对象的newInstance()方法只能使用默认的构造器,使得对象的创建有限制。
(2)若一个具体的类无默认的构造器,则会抛出异常。
2.工厂方法
与简单工厂方法相比,工厂方法加入了如下几个元素:
(1)工厂接口/抽象接口—具体工厂公共的接口/类型
(2)具体工厂—–由具体工厂负责具体产品的创建,且其必须保证产品的成功的创建,在具体工厂中可调用各种各样的构造方法,因为具体工厂中已将参数化类型具体化。
(3)工厂管理类——由此类可负责何种类型具体工厂的创建并可返回具体工厂的实例。
优点:加入了上述三个元素后,解决了以下问题:
1)所有的具体工厂拥有共同的接口
2)具体工厂保证了具体产品的成功创建:可调用任意的构造方法生成具体类的实例
3)工厂管理类:对具体工厂的生成拥有控制权,使具体工厂的生成具有了灵活性。
工厂方法的实现如下:
1)抽象工厂
这里写图片描述

2)AuthorFactory:负责Author实例的创建
这里写图片描述
3)IntegerFactory:负责Integer实例的创建
这里写图片描述

3)工厂管理类(泛型类):FactoryManage
这里写图片描述

4)测试客户端
这里写图片描述

补充:具体的Author类
这里写图片描述

3.模板方法
以更加简捷的方法生成具体类的实例。与工厂方法不同的地方在于:用模板类(抽象类)来控制整个实例化过程的流程(有点像工厂管理类,由模板方法控制整体流程,而具体创建过程由其子类实现),而由具体类来完成具体产品的构建。但在具体生成类的实例时,我还是用到了工厂的概念,但其只作为一个具体的实现而已。最大的优点:简捷,因为直接调用具体的生成类即可,并且模板类是隐藏的,对客户透明的(而工厂方法中管理类工厂要显式地生成)。
3.1模板类
这里写图片描述
3.2具体模板类AuthorCreator
这里写图片描述
3.3具体模板类:IntegerCreator
这里写图片描述
3.4客户端测试
这里写图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值