java中泛型学习总结

为什么需要使用泛型:

1):存储任意类型的数据在集合中 ,但是取出来都是Object类型的,此时就得强转.

List list = new ArrayList();list.add(1);
//Interger类型Object ele = list.get(0);
//现在需要调用Interger类中的方法I
nterger num = (Interger) ele;System.out.println(num);

      2):约束存储到集合中的元素必须是相同的数据类型(相同的数据类型才能做比较,比如TreeSet).

      3):设计一个点(Point)类,来封装坐标位置,要求坐标位置支持String类型.Integer类型/Double类型.

         如果重写多个方法是非常不雅的。

泛型(GenericType),Java5开始支持的新的语法:

  什么是泛型:

                  1):广泛通用的类型.

                  2):代码模板中类型不确定,谁调用该段代码,谁指明类型是什么.


java中泛型学习总结_第1张图片

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

 使用泛型:

    保证前后类型相同.

    List list = new ArrayList();//该List集合中只能存储String类型的元素.

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

     List list = new ArrayList<>();

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

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

     从此以后,使用集合都得使用泛型来约束该集合中元素的类型.

    通过反编译,发现:泛型其实也是语法糖,底层依然没有泛型,而且依然使用强转

java中泛型学习总结_第2张图片

泛型方法:在方法上声明泛型.

    情况1):泛型类中的泛型只能适用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法:

    情况2):泛型类中的泛型应该适用于整个类中多个方法,有时候只对某一个方法设置泛型即可.

-----------------------------------------------------

    一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须是由参数设置进来的.

   如果没有参数来设置泛型的具体类型,此时的方法一般返回设计为Object即可. java中泛型学习总结_第3张图片

泛型的通配符和上限和下限:

  泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知,通配符.

  此时只能接受数据,不能往该集合中存储数据.

java中泛型学习总结_第4张图片

泛型的上限和下限:用来限定元素的类型必须是X类的子类或相同, X的父类或相同.

java中泛型学习总结_第5张图片

泛型擦除和转换:

  泛型的擦除

                      1):泛型编译之后就消失了(泛型自动擦除);

                      2):当把带有泛型的集合赋给不带泛型的集合,此时泛型被擦除(手动擦除).

堆污染:

   java中泛型学习总结_第6张图片


你可能感兴趣的:(java基础)