泛型

泛型的格式:<数据类型>,泛型只能支持引用数据类型,用于判断存入的数据是否符合类型条件。目的是统一集合中的数据类型。

没有泛型的时候,可以往一个集合里添加任意类型的元素。但是所有元素的类型都默认为为Object类型。并且此时获取出来的数据都认为是object类型,因此不能使用子类的特有功能,而用强转实现特有功能时又会很麻烦,容易导致类型转换异常。因此推出了泛型的使用。

java中的泛型是伪泛型,只是在存入是判断一下数据是否为对应类型,而存入时还是按照Object类型存储,获取其中内容时又给出对应的类型。

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

泛型类

像arrayList就是一个泛型类,只有在输入这个E时,才会确定这个变量(看作一个变量)E的值,也就是确定数据类型(这个E,可以用任意值代替,就可以看作是一个变量)

public class ArrayList<E>{

}

此处尝试写了一个泛型类

import java.util.Arrays;

//这是一个泛型类,当编写代码时不确定类型时使用。
public class MyArrayList<E> {
    Object[] obj = new Object[10];
    int size;

    //此处的E,表示不确定的数据类型
    public boolean add(E e){
        obj[size] = e;
        size ++;
        return true;
    }

    public E get(int index){
        return (E)obj[index];
    }

    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}

泛型方法

方法中形参类型不确定时,可以在整个类上定义泛型,也可以仅在方法上定义一个泛型。

import java.util.ArrayList;

public class ListUtils {
    private ListUtils(){
    }

    public static <E> void addAll(ArrayList<E> list,E e1,E e2,E e3,E e4){
        list.add(e1);
        list.add(e2);
        list.add(e3);
        list.add(e4);
    }

    public static <E> void addAll2(ArrayList<E> list,E...e){
        for (E e1 : e) {
            list.add(e1);
        }
    }

}

泛型接口

泛型接口有两种实现方法:1.实现接口的类(实现类)中给出具体的类型2.实现类不给出具体类,等到创建对象时再确定类型。

泛型的继承和通配符

泛型不具备继承性,但是数据具备继承性。

当数据类型不确定,但是想限定一个方法以后只有一个继承体系里的类型可以使用时,就可以用泛型的通配符解决。

import java.util.ArrayList;

public class GenericsDemo3 {
    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);
        //method(list3);

        //用method3就不会报错
        method3(list1);
        method3(list2);
        method3(list3);


    }

    public static void method(ArrayList<Ye> list) {

    }

    //这样写方法也存在问题,此时任意的类型都可以使用这个方法
    //但是我这个方法的实际目的是只能由Ye,Fu,Zi能够使用
    //因此需要借助泛型的通配符来解决,也就是下面的方法
    public  static<E> void method2(ArrayList<E> list){

    }

    //? extends E  可以传递E及E的所有子类
    //? super E    可以传递E及E的所有父类
    public static void method3(ArrayList<? extends Ye>  list){}




}


class Ye{

}

class Fu extends Ye{

}

class Zi extends Fu{

}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐