2解决通用返回结果是泛型_Java泛型的学习与总结(上)

泛型是jdk1.5之后出的新语法,他有一个核心,根据这个核心衍生出很多的用法,

核心:帮助用户在编译期就能检测到代码运行期的一些错误

用法:避免手动强转与通用模板


避免手动强转

看一个例子,

在没有泛型之前:

/**
 * Son extends Father
 *
 * @author myllxy
 * @create 2019-12-15 22:04
 */
public class GenericTest1 {
    public static void main(String[] args) {
        testDemo1(new Father());
    }
	/**
     * 该方法中参数object是静态类型,静态类型的变化仅仅在使用时发生,
     * 变量本身的静态类型不会改变,并且最终的静态类型是在编译期可知的;
     * 而实际类型变化的结果在运行期在可以知道,编译器在编译程序的时候病
     * 不知道一个对象的实际类型是什么
     * 
     * 所以,在这个案例中我们可以看到,虽然最后报类型转换错误,但是编译期
     * 不会报错,因为Father确实能够直接向上转型成Object,注意着后面,
     * (Son)object是在=右边,相当于编译期编译期并不知道object是什么了
     * 他只是为了通过编码规定将object加了个(Son),但至于是否真的能转换
     * 看运行期了
     */
    private static void testDemo1(Object object) {
        Son son = (Son) object;
    }
}

在有了泛型之后:

/**
 * Son extends Father
 *
 * @author myllxy
 * @create 2019-12-15 22:04
 */
public class GenericTest1 {
    public static void main(String[] args) {
        testDemo1(new Father());
    }
    /**
     * 在加上泛型后上面的testDemo1(new Father())就会报错了
     * 具体T extends Son牵涉到的泛型的协变与逆变问题不在这里赘述了
     */
    private static <T extends Son> void testDemo1(T t) {
        Son son = (Son) t;
    }
}

这就是泛型,它为我们在编译期就将运行期可能的类型转换错误提前预知出来了,注意它是作用与编译期的,比如我们可以通过反射来绕过泛型的约束,通过反射获取ArrayList的add方法,这个时候你发现即使加了泛型,我也啥都能扔进去:

15a9e6a4b20e16bb9ee2e588f09222dd.png

通用模板

我们先来看看泛型在jdk中的一个经典的用法:

List list = new ArrayList<String>()
list.add("xx")
String xx = list.get(0)

相信这段代码大家都看得懂,

但是在jdk1.5之前你得这么写:

List list = new ArrayList();
list.add("xx");
// 获取到Object,必须强制转型为String:
String xx = (String) list.get(0);

所以泛型在这里的作用就是给我的容器指定可以放入的数据的类型E,而我get方法返回的时候就返回这个类型E,就避免了转型的操作可能带来的一系列问题比如类型转换异常等:

ec7c7ce9cad00f1683ed87f9d6584fc6.png

如果不使用反省,我们就只能为每一种数据类型设计一种ArrayList,比如StringArrayList,通过这种方式来规避转型问题,

这个ArrayList就是一个模板,哦,应该说是ArrayList<E>,

除开这个例子,模板与泛型结合使用的案例在源码与开发中到处都是:

  • mybatis-plus中的BaseMapper
  • RedisTemplate
  • ......

eea33c2fa5c600c422f7fd48b3e07042.png

47712802a9aa4c51783f946110a41012.png

关于模板方法设计模式:

反正我手长:模板方法模式​zhuanlan.zhihu.com
4c1cc9b608049a4e45fd69a5b104c0d3.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值