原创

什么是'泛型'

作者 | 浩说编程
来源 | 公众号:浩说编程
[  用"内容"服务读者 | 让"代码"服务大众  ]

  

泛型(Generics)不管在面试还是实际开发过程中都有高频率的应用,本文将带读者复习或更深层次的了解泛型的概念以及其底层原理


01 | '泛型'的概念

    泛型,官方解释叫做“参数化类型”。

    通俗的意思就是:将类、方法、变量的类型以参数的形式定义,然后在使用到对应类、方法、变量的时候再传入具体的类型。

    概念比较抽象且不好理解,下面我们通过具体实例应用来体会一下:

 

02 | 泛型应用:集合

    众所周知的定义集合的语法:List<> stringList = new ArrayList<>();

图片

    List后为何要用"<>"符号,为什么要这样写?

    其实这个“<>”就是指泛型。我将List接口源码拷过来给大家看一下泛型是如何定义的:

图片
    定义方式很简单,就是 ‘<>’ ,中间的E叫做泛型中的通配符。
      

03 | 关于'通配符':E、T、E、K、U、?

    通配符常用的有以上几种,严格来说这些字母并无区别,只不过是java为我们制定的一种编码规范,就像是命名要驼峰一样。

    其实通配符写什么都可以,只是编码规范为上面这几个字母赋予了不同的意义:

        ?:不确定的java类型

        T : 表示一个java类型

        K : java键值中的key

        V : java键值中的value

        E :集合中专用


04 | 由'通配符'延申的‘边界’的概念

    通配符的另外一种写法叫做’边界通配符’:

        1、<T extends H> : 上界通配符(extends),意思是该泛型可以容纳的类型参数只有H类以及H类下派生的子类

        2、<T super H> : 下界通配符(super),意思是该泛型可以容纳的类型参数只有H类以及以H基类的父类
 

05 | 泛型的原理:擦除

    通过上面的例子读者了解了泛型的概念以及泛型的通配符边界,接下来给读者拆解一下泛型的底层原理。

    java中的泛型只作用于编译期,原因是编译器将泛型类的.java文件编译成.class文件的时候,会对泛型进行擦除操作:

图片

    对比一下可以看出:编译器将类型参数T替换为了固定类型Object类(Object类是所有类的默认父类,所以可以承接任何类型的对象)

    结合一下上文提到的‘边界’的概念,将通配符T修改为T extends H,编译之后将被替换成H。这就是泛型的底层逻辑。

 

小试牛刀

图片


正文到此结束
本文目录