泛型
1.概念
用来约束容器只能存放某种类型的数据
2.基本使用
//此list只能存放Employee类型的对象
ArrayList<Employee> list = new ArrayList<Employee>();
list.add(new Employee("小王"));
list.add(new Employee("中王"));
list.add(new Employee("老王"));
3.自定义泛型
1.泛型类
(类 接口) ---->比如模拟ArrayList这样的结构 class Demo<泛型符号>{ }
泛型符号 可以是任意的符号,一般使用如下的字母:
E ------- Element
T -------Type
K -------Key
V -------Value
设计一个类来描述一个点,但是该类的点数据类型不确定
public class Point<T,K> {
private T x;
private K y;
public Point(T x, K y) {
super();
this.x = x;
this.y = y;
}
}
2.泛型方法
设计一个泛型方法,一个方法设计的时候,声明了泛型,在使用的时候才具体执行类型,传入一个数组,在方法内部,复制一份数组副本,将数组,排序之后返回
public static <T> T[] getArr(T[] src){//src.getClass()知道具体类型就可以创建数组了
Object[] copyOf = Arrays.copyOf(src, src.length, src.getClass());
Arrays.sort(copyOf);
return ( T[] )copyOf;
}
4.4泛型的上限和下限
- ?表示未知的类型
- 泛型的上限 约束传入的类型 最高为什么类型 ? extends 类型
- 泛型的下限 约束传入的类型最低为什么类型 ? super 类型
public class GenericTest2 {
/*
* 泛型的上限和下限
* */
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Double> list2 = new ArrayList<Double>();
ArrayList<Object> list3 = new ArrayList<Object>();
//show(list);//Number及其子类才能调用该方法,String不是,所以报错
show(list1);
show(list2);
test(list3);//Number及其父类才能调用该方法,Object是,所以正确
}
public static void show(List<? extends Number> list){
}
public static void test(List<? super Number> list){
}
}