Java 泛型

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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或者其他引用类型,而这些引用类型不能存储基本数据类型,所以基本数据类型不能作为泛型。