持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
Java泛型是JDK1.5引入的一个新特性,他在Java中有重要的作用,由于需要兼容JDK1.5之前的版本,Java中的泛型其实算"伪泛型",虽然在语法上支持了泛型,但是在编辑时会将泛型擦除,变为Object。
泛型
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
泛型类
类上面定义泛型
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}
我们经常使用的ArrayList就是一个泛型类,<>中定义泛型类型,需要注意的是泛型类型不能是基本数据类型,如int,long,而应该使用他们对应的引用类型Integer,Long等。
泛型方法
把泛型定义在方法上面
public <T> T function(T t) {return t; }
定义一个泛型方法,需要在返回值前面加,他是在调用方法的时候才指明泛型的类型。
String s = function("");
Integer i = function(1);
调用上面的泛型方法可以看出,他会随着我们传入参数类型的不同,他获取到的类型也不同,泛型方法可以独立于类而产生的变化。
泛型擦除
前面说到,泛型在编译期间会被擦除。
class TypeData<T>{
T data;
}
该类编译之后泛型擦除变为
class TypeData{
Object data;
}
泛型直接被去掉了,变成了Object,但是并不是所有的擦除都会变成Object,当我们指定泛型的边界的时候,在类型擦除中就会替换为类型参数的上界或者下界。
class TypeData<T extends People>{
T data;
}
擦除之后变为
class TypeData{
People data;
}
由于泛型擦除之后会变为Object或者其他引用类型,而这些引用类型不能存储基本数据类型,所以基本数据类型不能作为泛型。