泛型

76 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

集合中使用泛型

  • 集合接口或集合类在JDK5.0时都修改为带泛型的结构

  • 在实例化集合类时,可以指明具体的泛型类型

  • 泛型的类型不能是基本数据类型

  • 如果实例化时,没有指定泛型的类型,默认类型为Object

泛型类

  • 泛型不同的引用不能相互赋值

  • 静态成员中不能使用类的泛型

  • 异常类不能声明为泛型类

  • 使用泛型的数组不能初始化

    • 不能使用new E[],编译时会把E当成一个类,同理不能new E

    • 解决:E[] elements = (E[]) new Object[capacity]

    • 参考:ArrayList源码中声明:Object[] elementData,而非泛型数组

  • 父类有泛型,子类可以选择指定或保留全部泛型也可以增加自己的泛型

  • 类A是类B的父类,但是 G<A> 和 G<B>二者不具备继承关系,二者是并列关系,共同父类是G<?>

    • 类A是类B的父类,A<G> 是 B<G> 的父类

泛型方法

  • 在方法中出现泛型的结构,与所属类是不是泛型类没有关系。格式如下:

[访问权限] <泛型> 返回类型 方法名( [泛型标识 参数名称 ] )

  • 不加 <泛型> 的话编译器会把泛型标识当成一个类

  • 泛型方法可以声明为静态的。原因:泛型参数是在调用方法时确定的,并非在实例化类。

通配符

使用类型通配符:?

  • 比如:List<?>,Map<?,?>。List<?>是List<String>、List<Object>等各种泛型List的父类。

  • 对于List<?>,不能向其内部添加数据,除了null

  • 对于List<?>,允许获取数据,获取的数据类型为Object

限制条件:

以下添加和读取了解即可(正常人谁会拿list<? super B>添加读取啊),通过多态进行理解,实际开发中会给通配符泛型赋值具体的类,限制通配符只是做一个约束

  • <? extends A>: 支持A类以及A类的子类,相当于 (-∞,A] ,规定了泛型的上限

    • list<? extends A>为例

    • 添加:不能向其内部添加数据。原因:不能添加泛型的父类。

      image.png

      在此区间取一点永远有人比你小。

    • 读取:获取的数据类型为A

  • <? super B>: 支持B类以及B类的父类,相当于 [B,+∞) ,规定了泛型的下限

    • list<? super B>为例
    • 添加:可以添加B和B的子类
    • 读取:获取的数据类型为Object