泛型的详解

来源:互联网 发布:淘宝水印美图秀秀教程 编辑:程序博客网 时间:2024/05/16 14:16
为什么需要使用泛型:
1、存储任意类型的数据在集合中,但是取出来都是Object类型的,此时就得强转;
2、约束存储到集合中的元素必须是相同数据类型(相同的数据类型才能做比较,比如TreeSet类);

3、假设设计一个点(Point)类,来封装坐标位置,要求坐标位置支持String类型,Integer类型和Double类型。这种情况就会出现重复定义。


重复定义:

public class Point1{private String x;private String y;}public class Point2{private Integer x;private Integer y;}public class Point3{private Double x;private Double y;}


泛型(GenericType),从Java5开始支持新的语法:
什么是泛型:
1、广泛使用的类型;
2、代码模板中类型不确定,谁调用该段代码,谁就指明类型。

泛型类:直接在类/接口上定义的泛型。
使用泛型:保证前后类型相同
       List<String> list = new ArrayList<String>(); //该集合中只能存储String类型的元素。
因为前后类型相同,所以Java7开始推出泛型的菱形语法<>。
       List<String> list = new ArrayList<>();

泛型不存在继承关系(错误如下):
       List<Object> list = new ArrayList<String>();//错误的


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


泛型方法:在方法上声明泛型。
情况1:泛型类中的泛型只能使用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法;
情况2:泛型类中的泛型应该适用于整个类中多个方法,有时候只对某个方法设置泛型即可。

一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须是由参数设置进来的。
如果没有参数来设置泛型的具体类型,此时的方法一般返回设计为Object即可。

public static <T> T doWork(T val){      //TODO       return val;}

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

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


public static void main(String[] args) {List<Integer> list1 = new ArraysList<>();doWork(list1);List<String> list2 = new ArraysList<>();doWork(list2);}private static void doWork(List<?> list) {// TODO}


泛型的上下限非常少使用到,这里只是简单的说明一下:
泛型的上限和下限,用来限定元素类型必须是X类的子类或相同,X类的父类或相同。


泛型擦除和转换:(泛型的擦除)

1、泛型编译之后就消失(泛型自动擦除);
2、当把带有泛型的集合赋给不带泛型的集合,此时泛型被擦除(手动擦除)。

原创粉丝点击