• Java基础21-泛型


    一、什么是泛型?

    泛型是从Java5开始的新语法,泛型即指广泛通用的类型,代码模板中类型不确定,谁调用该段代码,谁指明类型是什么。

    “泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。”

    引自https://www.cnblogs.com/lwbqqyumidi/p/3837629.html

    二、为什么需要泛型?

    1.存储任意类型的元素在集合中,取出来都是object类型的,此时需要强转,而且有时编译不会报错,而在运行时会出错。

    2.约束存储到集合中的元素必须是相同的数据类型(相同的数据类型才能比较)
    3.设计一个点(Point)类,来封装坐标位置要求坐标位置支持String类型,Integer类型/Double类型,这样需要定义三个类

    显然不够优雅

     三、泛型的使用

    我们如何解决上述问题呢? 接下来,交给我们的泛型类

     1.泛型类:直接在类/接口上定义的泛型。

    上述代码就可以改成

    我们需要什么类型就将它定义为什么类型。

     使用泛型时需要保证前后类型相同

    List<String> list=new ArrayList<String>();//List集合中只能存储String类型的

    * 因为前后类型相同,所以从java7开始,退出了泛型的菱形语法<>

    List<String> list=new ArrayList<>();

    * 泛型不存在继承的关系(错误如下).

     List<Object> list=new ArrayList<String>();//错误

    * 从此以后,使用集合都得使用泛型来约束该集合中的元素类型
    * 通过反编译:发现泛型其实也是语法糖,底层依然没有泛型,而且使用强转

     2.泛型方法

    * 情况1:泛型类中的泛型只能适用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法
    * 情况2:泛型类中的泛型应该适用于整个类中多个方法,有时候只对某一个方法设置泛型即可
    * 一般的,把自定义的泛型作为该方法的返回类型才有意义。而且此时的泛型必须是由参数设置进来的
    * 如果没有参数来设置泛型的具体类型,此时的方法一般返回设计为Object即可

     

    四、泛型的通配符和上下限

    * 泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?表示未知,这是通配符
    * 此时只能接受数据,不能往该集合中存储数据
    * 泛型的上限和下限:
    * 用来限定元素的类型必须是x类的子类或相同,x的父类或相同

     

    五、泛型的擦除

    * 1.泛型编译之后就消失了(泛型自动擦除);
    * 2.当把带有泛型的集合赋给不带泛型的集合,此时泛型被擦除
    * 堆污染:
    * 当一个方法既使用泛型的时候,也使用可变参数,此时容易导致堆污染问题

  • 相关阅读:
    Augular JS里的各种ng-
    JS笔记1
    JQuery实战学习--在dreamweaver 8中配置Jquery自动提示
    android 设置桌面背景图片适应屏幕大小
    canvas实现进度条!
    Javascript之Prototype
    Sql Server 之 for xml (path,raw,auto,root)
    MVC 知识点学习3(linq to sql)
    MVC 知识点学习2
    MVC 知识点学习1
  • 原文地址:https://www.cnblogs.com/LuckyGJX/p/9099240.html
Copyright © 2020-2023  润新知