泛型
一、概述
1.概述
泛型是JDK5之后引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型,它的本质是参数化类型,参数化类型就是将类型由原来的具体类型参数化,然后再使用/调用时传入具体的类型。这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法和泛型接口。
2.定义格式
- <类型>:指定一种类型的格式,这里的类型可以看成是形参。
- <类型,类型...>:指定多种类型的格式,多种类型之间用逗号隔开,这里的类型可以看成是形参。
- 具体调用的时候给定的类型可以看成实参,并且实参只能是引用类型数据。
3.好处
- 把运行时期的问题提前到了编译期
- 避免了强制类型转换
二、泛型类、方法、接口的定义与使用
1.泛型类定义格式
格式:修饰符 class 类名<类型>{}
范例:public class Generic<T>{}
注意:通常用T,E,K,V等形式的参数表示泛型
2.泛型方法定义格式
格式:修饰符 <类型> 返回值类型 方法名(类型 变量名){}
范例:public <T> void show(T t){}
3.泛型接口定义格式
格式:修饰符 interface 接口名<类型>{}
范例:public interface Generic<T>{}
三、类型通配符
1.概述
为了表示各种泛型List的父类,可以使用类型通配符
- 类型通配符:<?>
- List<?>:表示元素类型未知的List,它的元素可以匹配任何类型
- 这种带通配符的List仅表示它是各种类型List的父类,并不能把元素添加到其中
2.通配符上限
使用通配符上限可以让List<?>仅代表某一类泛型List的父类。
- 类型通配符上限:<? extends 类型>
- List<? extends Number>:表示类型是Number或者其子类型
3.通配符下限
- 类型通配符下限:<? super类型>
- List<? superNumber>:表示类型是Number或者父类型
四、可变参数
1.概述
可变参数又称参数个数可变,用作方法的形参出现,方法参数的个数可变。
格式:修饰符 返回值类型 方法名(数据类型...变量名){}
范例:public static int sum(int...a){}
2.注意事项
- 变量其实是一个数组
- 若一个方法有多个参数,那么可变参数要放到最后边
3.使用
Arrays工具类中的一个静态方法public static <T> List <T> asList(T...a),该方法返回由指定数组支持的固定大小的列表,返回的集合不能做增删操作,可以做修改操作;List接口中的一个静态方法public static <E> List <E> of(E...elements),该方法返回包含任意数量元素的不可变列表,返回的集合不能做增删改操作;Set接口中的一个静态方法public static <E> Set<E> of(E...elements),该方法返回包含任意数量元素的不可变集合,初始化时不能给重复元素,返回的集合不能做增删操作,没有修改的方法。