咨询热线
咨询热线:
028-86052836
在线咨询
官方微信
一起学JAVA——泛型
时间:2020-05-07 | 作者: | 浏览:1592
  • 一起学JAVA——泛型
    时间:2020-05-07 | 作者: | 浏览:1592

    什么是泛型

    java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数是实际参数的占位符一样。

    泛型能保证大型应用程序的类型安全和良好的维护性;

    使用泛型的优势:类型安全,使编译器对泛型定义的类型做判断限制.如保证TreeSet里的元素类型必须一致; 消除强制类型的转换,如,使用Comparable比较时每次都需要类型强转;

    泛型类

    在类声明时通过一个标志符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok。


    image.png

    声明多个泛型类型

    若一个类中多个字段需要不同的泛型声明,则在声明类的时候指定多个泛型类型即可;


    image.png

    通配符

    在进行引用传递的时候泛型类型必须匹配才可以传递,否则编译不通过;

    使用 ? ,表示未知类型的泛型对象:

    List<?> 表示未知元素的List集合;

    这种带通配符的List仅表示各种泛型List的父类,并不能把元素添加入集合中; List<?> list = new ArrayList<>();

    list.add(1); //ERROR

    public void show(List<?> list){} //表示可接受任意类型的List集合

    泛型的上限与下限

    设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类;

    设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类;


    image.png

    泛型和子类继承的限制

    对象的多态性,我们可以

    父类 对象 = new 子类();

    但是在父类泛型类型和子泛型类型之间不存在这种关系:

    类<Number> 对象 = new 类<Integer>();×

    image.png

    泛型接口

    java5后,可以声明泛型接口,声明方式和声明泛型类是一样的。

    public interface IDAO<T>{}

    泛型接口子类有两种方式:

    直接在子类后申明泛型;在子类实现的接口中给出具体的泛型类型


    image.png

    泛型方法

    方法中可定义泛型参数,形参的参数类型就是实参的类型。


    image.png

    泛型的擦除

    在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但是为了和老的Java代码保持一致,也允许在使用带泛型声明的类时不指定类型参数,若没有为这个泛型类指定类型参数则该类型参数被称做一个原始类型,默认是该声明参数时指定的最上限类型;

    当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,则所有在尖括号之间的类型信息都被扔掉。

    比如List<String> 类型转换成List,则该List对集合元素的类型检查变成了变量的上限即Object。


    image.png


    什么是泛型

    java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数是实际参数的占位符一样。

    泛型能保证大型应用程序的类型安全和良好的维护性;

    使用泛型的优势:类型安全,使编译器对泛型定义的类型做判断限制.如保证TreeSet里的元素类型必须一致; 消除强制类型的转换,如,使用Comparable比较时每次都需要类型强转;

    泛型类

    在类声明时通过一个标志符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok。


    image.png

    声明多个泛型类型

    若一个类中多个字段需要不同的泛型声明,则在声明类的时候指定多个泛型类型即可;


    image.png

    通配符

    在进行引用传递的时候泛型类型必须匹配才可以传递,否则编译不通过;

    使用 ? ,表示未知类型的泛型对象:

    List<?> 表示未知元素的List集合;

    这种带通配符的List仅表示各种泛型List的父类,并不能把元素添加入集合中; List<?> list = new ArrayList<>();

    list.add(1); //ERROR

    public void show(List<?> list){} //表示可接受任意类型的List集合

    泛型的上限与下限

    设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类;

    设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类;


    image.png

    泛型和子类继承的限制

    对象的多态性,我们可以

    父类 对象 = new 子类();

    但是在父类泛型类型和子泛型类型之间不存在这种关系:

    类<Number> 对象 = new 类<Integer>();×

    image.png

    泛型接口

    java5后,可以声明泛型接口,声明方式和声明泛型类是一样的。

    public interface IDAO<T>{}

    泛型接口子类有两种方式:

    直接在子类后申明泛型;在子类实现的接口中给出具体的泛型类型


    image.png

    泛型方法

    方法中可定义泛型参数,形参的参数类型就是实参的类型。


    image.png

    泛型的擦除

    在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但是为了和老的Java代码保持一致,也允许在使用带泛型声明的类时不指定类型参数,若没有为这个泛型类指定类型参数则该类型参数被称做一个原始类型,默认是该声明参数时指定的最上限类型;

    当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,则所有在尖括号之间的类型信息都被扔掉。

    比如List<String> 类型转换成List,则该List对集合元素的类型检查变成了变量的上限即Object。


    image.png


    分享到:
  • 下单热线: 028-86052836/ 18980549418
    我要和顾问聊聊
    友情链接:
    在线客服
    扫码关注我们
    18980549418
    业务咨询,我们欢迎您的来电!
    13320969483
    服务热线
    扫码关注我们
    重庆天健世纪科技有限公司是一家从事政府、企事业单位信息化系统研发、企业门户建设、移动客户端开发、电子商务运营、技术服务、互联网一站式营销的国家高新技术企业。
    业务咨询: 18980549418
    服务电话: 13320969483
    公司地址: 重庆市两江新区黄山大道中段 1 号
    关注我们
    在线客服
    Copyright© 2020 天健世纪. All Rights Reserved. 渝ICP备20003512号
    Copyright© 2020 天健世纪. All Rights Reserved.
    渝ICP备20003512号