为什么需要使用泛型:
1、存储任意类型的数据在集合中,但是取出来都是Object类型的,此时就得强转;
2、约束存储到集合中的元素必须是相同数据类型(相同的数据类型才能做比较,比如TreeSet类);
泛型(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即可。
泛型的通配符,以及上限和下限:
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知,通配符。
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、当把带有泛型的集合赋给不带泛型的集合,此时泛型被擦除(手动擦除)。