一、什么是泛型
泛型:就是一种不确定的数据类型。
比如:ArrayList<E> E就是泛型。 这种不确定的数据类型需要在使用这个类的时候才能够确定出来。
泛型可以省略,如果省略,默认泛型是Object类型。
泛型的好处:
1. 省略了强转的代码。
2. 可以把运行时的问题提前到编译时期。
二、为什么使用泛型
(1)保证了类型的安全性:泛型约束了变量的类型,保证了类型的安全性。例如List<int>和ArrayList。List<int>集合只能加入int类型的变量,ArrayList可以Add任何常用类型,编译的时候不会提示错误。
(2)避免了不必要的装箱、拆箱操作,提高程序的性能:泛型变量固定了类型,使用的时候就已经知道是值类型还是引用类型,避免了不必要的装箱、拆箱操作。
三、如何使用泛型
泛型可以定义在类上,接口上,方法上。 泛型类,泛型接口以及泛型方法。
泛型可以解决数据类型的安全性问题,其主要原理是在类声明时通过一个==标识表示类中某个属性的数据类型或者是某个方法的返回值及参数类型==。这样在类声明或者实例化时只要指定好需要的类型即可。
泛型的格式:
public class<标识,标识.....>{
private 标识 变量名;
public 标识 方法名称(标识 参数名){
}
}
举例:
测试类:
四、通配符
在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行引用传递时泛型类型必须匹配才可以传递,否则是无法传递的。
package demo03;
/**
* @program: 泛型
* @author: yanci
* @create: 2022-01-10 10:09
**/
public class Test {
public static void main(String[] args) {
Info<String> info=new Info<>();
info.setVar("hello world");
fun(info); //因为类型也匹配 而且泛型也匹配
Info<Double> info2=new Info<>();
info2.setVar(25.5);
fun(info2); //传递泛型的引用类型时必须泛型也匹配,如果不匹配 则引用类型无法调用。
//能不能泛型类型可以传递任意的类型呢?
}
//定义一个方法 该方法的参数为泛型类的引用类型. 可以使用泛型的通配符【?】。
public static void fun(Info<?> info){
info.show();
}
}
class Info<T>{
private T var;
public void show(){
System.out.println("var======="+var);
}
public T getVar() {
return var;
}
public void setVar(T var) {
this.var = var;
}
}
五、受限泛型
在引用传递中,在泛型操作中也可以设置一个泛型对象的范围上限和范围下限。
范围上限使用extends关键字声明,表示参数化的类型可能是所指定的类型或者是此类型的子类
范围下限使用super进行声明,表示参数化的类型可能是所指定的类型或者此类型的父类型。
格式:
[设置上限]
声明对象: 类名称<? extends 类> 对象名称;
定义类: [访问权限] 类名称<泛型标识 extends 类>{}
[设置下限]
声明对象: 类名称<? super 类> 对象名称;
定义类: [访问权限] 类名称<泛型标识 super 类>{}