1.什么是泛型
1.1 概述
JDK5引入的新特性,所操作的数据类型变成了一个参数。将原来的具体类型参数化,然后在调用时再传入具体的类型,这种参数类型用在类,方法和接口中,就成了泛型类,泛型方法,泛型接口。
1.2 泛型定义格式
<>
<type1,type2>
1.3 GenericDemo
问题:一个Collection类对象,里面可以储存任意类型元素,在其中放入String类型元素,输出时类型强转为String,正常输出。但是当里面加入了整数型元素,再强转输出就会出现类型转换异常ClassCastException
解决方法:使用泛型,1. 将运行时异常提前到了编译,2. 避免了类型转换
2.泛型类
爷就是想用一个方法接收不同类型,不想搞两个类,那么我们就可以用一个泛型类
格式:public class Generic
其中T可以被写为任意标记,常用的有T、E、K、V
泛型类Demo:
//泛型类
public class Generic<T>{
private T t;
public T getT(){
return t;
}
public T setT(){
this.t=t;
}
}
Generic<String> g1 = new Generic<String>();
g1.set("名字");
System.out.println(g1.getT());
Generic<Integer> g2 = new Generic<Integer>();
g2.setT(12);
System.out.println(g2.getT());
//都可以正常输出
3.泛型方法
场景 一个类里面重写了一堆方法,参数不同。但是好麻烦
泛型类每次都要创建对象还要声明类型
定义格式:public void showT(T t){};
泛型方法Demo:
但是为什么有了这个还需要方法重载?
4.泛型接口
格式:public interface Generic{}
泛型接口Demo:
//接口
public interface Generic<T> {
void show(T t);
}
//泛型接口的实现类
public class GenericImpl<T> implements Generic<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
//测试demo
public class GenericInterfaceDemo {
public static void main(String[] args) {
Generic<String> g1 = new GenericImpl<>();
g1.show("wyd小朋友");
Generic<Integer> g2 =new GenericImpl<>();
g2.show(24);
}
}
5.类型通配符
<?>用来表示各种泛型List的父类,List<?>元素可以匹配任何的类型,并不能把元素添加在其中类型通配符上限:<? extends 类型> 限制了最高的类型,可表示当前类型与其子类型
类型通配符下限:<? super 类型>限制了最低的类型,不能比当前类型更小
6.可变参数
场景:有一堆相加求和的函数,但是参与运算的个数不同,又搞出了一堆重写,这样不好
实际上可变参数内部a是个数组,把所有的参数都封装进了数组a,所以对数组各元素求和就能求和
注意:1.一个方法中只能有一个可变参数。2.一个方法中含有多个参数,可变参数必须放在最后
JDK中的可变参数方法
Arrays.asList(T… a)返回制定数组支持的固定大小列表
增删都不行,可以改
List.of(E…elements)返回包含任意元素数量的不可变列表
增删改都不行
Set.of(E…elements)返回包含任意元素数量的不可变集合
集合不能有重复元素
不能做增删操作