一、泛型的概述
—— 泛型的本质就是参数化类型,所用是将原来的具体的类型参数化,然后再使用和调用的时候传入具体的参数。
这种参数类型,可以用整改类、方法、接口中,分别称为泛型类、泛型方法、泛型接口。
泛型的定义格式: <类型>:指定一种类型的格式,这里的类型可以看成形参
<类型1,类型2,.....>:指定的是多种类型的格式,之间用逗号隔开
泛型的好处:把运行时期的问题提前到了编译期间;避免了强制类转换
二、泛型类的定义格式
泛型类定义格式:修饰符 class 类名<类型>{}
eg:public class Gneric <T>{}
此处的T代表的是数据类型,即标识符:T,E,K,V,调用什么类型对象时,就会使用什么类型
三、泛型方法
格式: 修饰符 <类型> 返回值类型 方法名(类型 变量名){}
eg: public <T> void show (T t) { }
四、泛型接口
格式:修饰符 interface 接口名 <类型>{}
eg:public interface Generic <T> { }
五、类型通配符
——为了表示各种泛型List的父类,可以受用类型通配符
类型通配符 <?>
1. List<?>:表示元素类型未知的list,它的元素可以匹配任何类型
2. List<? extends 类型> :类型通配符的上限,表示该类型或其子类型。
3. List<? super 类型>: 类型通配符的下限,表示该类型或其父类型
eg:List <?> list=new ArrayList<Object>();
List<? extends Number> list=new ArrayList<Integer>();
List<? super Number> list =new ArrayList<Object>();
其中:父类—>子类:Object—Number—Integer
六、可变参数
——可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是i可变的了
格式:修饰符 返回值类型 方法名 (数据类型...变量名)
eg:public static int sum(int...a){} 此处的a时一个数组,
eg:public void sum(int b,int...a){} 此处多个参数时,应把可变参数放在最后。
可变参数的使用:
1、Arrays工具类中有一个静态方法
public static<T> List <T > asList (T...a) : 返回一个由指定数组支持的固定大小的列表 (可以有重复数)
注意:不能用add,remove 只能 用set
public class bb {
public static void main(String[] args) {
List<Integer> s = Arrays.asList(1, 2, 3, 4);
s.set(1,5);
System.out.println(s);//输出[1, 5, 3, 4]
}
}
2、List 接口中 由一个静态方法 (jdk9才有这个功能)
public static<E> List <E> of(E...elements): 返回一个包含任意数量元素的不可变列表(可以有重复数)
注意:不能增、删、减
3、Set接口中有一个静态方法: (jdk9才有这个功能)
public static <E> Set <E> of (E...elements) :返回一个包含任意数量元素的不可变集合(不可以重复)
注意:不饿能增删减,也不能有重复元素