初识泛型的应用
作用:对输入的内容加以约束
格式:< 类型形参>
什么是泛型
- 所谓泛型,就是允许在定义类、接口、方法时使用类型形参(泛型),这个类型形参将在声明变量、创建对象、调用方法时动态地指定,进而让程序具备编译时检查能力
- 泛型是JDK1.5提供的特性,最常见的泛型应用场景便是在使用集合时通过泛型指定集合内对象的类型,为程序代码提供了编译是纠错的能力
自定义泛型类
自定义泛型类,需要在类名后增加"< 标识符>"
public class SampleClass<T>{...}
< T>与< E>的区别
- 标识符的字母本身并无强制要求,常见写法有两种:
- < T>是Type单词的首字母,说明传入的是类型
- < E>是Element元素的首字母,代表是集合中的元素
Random 生成随机数的类 其中的nextInt()方法时随机生成一个指定范围内的整数
//实现随机选择List中的元素
public class CollectionUtils<E> {
private List<E> data = new ArrayList();
public void add(E element){
data.add(element);
}
public E randomSelect(){
int idx = new Random().nextInt(data.size());
E ret = data.get(idx);
return ret;
}
public static void main(String[] args) {
CollectionUtils<String> utils = new CollectionUtils();
utils.add("张三");
utils.add("李四");
utils.add("王五");
utils.add("赵六");
String name = utils.randomSelect();
System.out.println(name);
}
}
泛型方法
-
JDK1.5以后还提供了泛型方法的支持,允许在类没有声明泛型的前提下让方法独立使用泛型进行开发
public <T> List<T> transferToList(T[] array){ }
实例
transferToList()将传入的数组转换为List
这里泛型的作用就是强制要求返回值里的类型和传入参数的类型一致
public class PtMethod {
//泛型方法,要求返回值类型与参数类型保持一致
public <T> List<T> transferToList(T[] array){
List<T> list = new ArrayList();
for(T item : array){
list.add(item);
}
return list;
}
public static void main(String[] args) {
PtMethod ptMethod = new PtMethod();
String[] array = new String[]{"A", "B", "C", "D", "E"};
List<String> list = ptMethod.transferToList(array);
System.out.println(list);
}
}
泛型通配符
- 当明确指定泛型类型后,就必须强制使用该类型传入,该类型的子类也会报"类型不匹配"错误
- 为了增加泛型的匹配范围,泛型通配符< ?> 应运而生
< ?>通配符与匹配范围
< ?>代表所有类型均可传入
通过extenfs与super限定范围
extends关键字代表必须传入Shape或者子类才通过检查
//方法定义:
public void doSth(List< ? extends Shape> shapeList)
super关键字代表必须传入Rectangle或者其父类才能通过检查
//方法定义:
public void doSth(List < ? super Rectangle>shapeList)