泛型

70 阅读2分钟

相信大家在之前集合的学习当中了解到有关泛型的相关知识,那么今天我们就来学习一下泛型吧

泛型

屏幕截图 2023-11-27 212644.png

那jdk5以前的泛型是怎么限定的呢??

Arraylist list=new Arraylist();
list.add(132);
list.add("absd");

如果说我们在创建集合的时候没有限定类型的话,那么默认所有的数据类型为object类型,那么可以输入一切的类型.

弊端: 我们在获取数据的时候,无法使用它的特有行为,而且在外面获取数据时候要进行强转

此时就推出了泛型,可以再添加数据的时候把类型进行统一,而且发我们在获取数据的时候,也省了强转,发错的方便

屏幕截图 2023-11-27 190348.png

屏幕截图 2023-11-27 214218.png

泛型就相当于一个守门员,当你符合泛型的时候,才可以添加进去,进去后集合还是会把这些数据当成object类型进行处理,当往外获取的时候集合就会按照泛型进行强转泛型的额类型

泛型类,泛型方法,泛型接口

屏幕截图 2023-11-27 214817.png

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.在方法声明上自己定义的泛型(只有本方法可用)

image.png

public static <E> void addalll(ArrayList<E>list,E e1,E e2){
    list.add(e1);
    list.add(e2);

泛型接口:

image.png

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 对象,这就是数据的继承性

image.png

 public static void method(ArrayList<? extends ye>list){}

这样就能够进行子类的传入了