相信大家在之前集合的学习当中了解到有关泛型的相关知识,那么今天我们就来学习一下泛型吧
泛型
那jdk5以前的泛型是怎么限定的呢??
Arraylist list=new Arraylist();
list.add(132);
list.add("absd");
如果说我们在创建集合的时候没有限定类型的话,那么默认所有的数据类型为object类型,那么可以输入一切的类型.
弊端: 我们在获取数据的时候,无法使用它的特有行为,而且在外面获取数据时候要进行强转
此时就推出了泛型,可以再添加数据的时候把类型进行统一,而且发我们在获取数据的时候,也省了强转,发错的方便
泛型就相当于一个守门员,当你符合泛型的时候,才可以添加进去,进去后集合还是会把这些数据当成object类型进行处理,当往外获取的时候集合就会按照泛型进行强转泛型的额类型
泛型类,泛型方法,泛型接口
Object[] obj=new Object[10];
int size;
public boolean add(E e){
obj[size]=e;
size++;
return true;
}
public E get(int idex){return(E)obj[idex];}
@Override
public String toString() {
return Arrays.toString(obj);
}
E:表示是不确定的类型,该类型在类名后面已经被定义过了
e:形参的名字
以上代码就是一个带有泛型的类
array1<String> s=new array1<>();
s.add("zhang");
s.add("shi");
s.add("huan");
创建的时候为string
遍历得到 [zhang, shi, huan, null, null, null, null, null, null, null]
add这就相当于一个简单的集合添加的方法重写
其中的get方法,也用了泛型的方法,当类累创建的时候E也跟着确定下来
泛型方法:
方法中形参类型不确定时 1.使用类名后面定义的泛型(所有方法都可用) 2.在方法声明上自己定义的泛型(只有本方法可用)
public static <E> void addalll(ArrayList<E>list,E e1,E e2){
list.add(e1);
list.add(e2);
泛型接口:
public class myarrayslist implements List<String>{
重写方法
}
public class array2_1<E> implements List<E>{
重写方法
}
泛型的继承和通配符
泛型不具备继承性,但是数据具备继承性
public class array3 {
public static void main(String[] args) {
ArrayList<ye>list1=new ArrayList<>();
ArrayList<fu>list2=new ArrayList<>();
ArrayList<zi>list3=new ArrayList<>();
method(list1);
method(list2);
}
public static void method(ArrayList<ye>list){}
}
class ye{}
class fu extends ye {}
class zi extends fu{}
以上method(list2)会报错
泛型里面写什么类型,那么只能传递什么类型
而我们可以再集合当中添加ye,fu,zi 对象,这就是数据的继承性
public static void method(ArrayList<? extends ye>list){}
这样就能够进行子类的传入了