1.概述
泛型,即“参数化类型”。
一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型只在编译阶段有效,在编译之后程序会采取去泛型化的措施。
2.泛型的使用
- 泛型类
- 泛型方法
- 泛型接口
2.1 泛型类
泛型类型用于类的定义中,被称为泛型类。
格式:
class 类名<泛型参数>
{
}
说明:
1.在类上定义的泛型,当外界在创建这个类的对象的时候,需要创建者自己来明确当前泛型的具体类型;
2.在类上定义的泛型,在类中的方法上和成员变量是可以使用的;
3.创建类的对象时没有指定泛型类的类型时,那么ABC默认是Object类型;
注意:对于自定义泛型类只有在创建这个类的对象的时候才可以指定泛型的类型。
2.2 泛型方法
在函数上使用泛型的格式:
函数修饰符 <泛型名> 函数返回值类型 方法名( 泛型名 变量名 )
{
函数体;
}
说明:
1.public 与 返回值/void中间非常重要,可以理解为声明此方法为泛型方法。
2.只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
3.表明该方法将使用泛型类型Q,此时才可以在方法中使用泛型类型Q。
4.与泛型类的定义一样,此处Q可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
注意:
1.方法上的泛型和类上的泛型无关
2.类上的泛型在创建这个类的时候确定,而方法上的泛型在调用这个方法时确定
静态函数上的泛型:
静态函数不能使用类上定义的泛型。
因为静态方法的运行是不需要对象的,而类上的泛型必须在创建这个类对象的时候才能明确具体是什么类型。
而静态函数运行的时候是没有对象的,也就是说类上的泛型在静态函数运行的时候还不知道是什么类型。
2.3 泛型接口
泛型接口的格式:
修饰符 interface 接口名<泛型>{}
什么时候确定泛型的类型呢?有两种方式可以实现。
方式1:类实现接口的时候,直接明确泛型类型。
方式2:类实现接口的时候,还不确定数据类型,这时可以在实现类上随便先定义个泛型,当这个类被创建对象的时候,就明确了类上的泛型,于是接口上的泛型也明确了。
2.4 泛型通配符
如果的两个函数以函数重载的形式存在,只有泛型的数据类型不一致,而且都是ArrayList,我们可以简化代码的开发,我们可以只定义一个函数来遍历集合。
所以这里我们只能借助泛型中通配符可以实现 : ?
? 表示泛型的通配符,表示集合中的任意数据类型,传递过来的表示什么数据类型,?就表示什么数据类型