什么是泛型

Java
429
0
0
2022-11-26

引出问题

在之前的顺序表中,如果定义了一个int类型的顺序表(或这说是数组),就只能存储整数,这样显然是不合适的。 应该让这个类同时存储多种类型的数据,就引出了“泛型”这样的概念

Object类

Object是所有父类的子类,在某种意义上也可以代替泛型进行使用,但是在使用的过程中也会出现一些问题: 例如以下代码使用Object来实现的

public class TestDemo0118_1 {
    //如果刚开始定义的时候不用 
    private Object[] data = new Object[10];
    private int size;

    public Object get(int index){
        return data[index];
    }
    
    public void add(Object elem){
        data[size] = elem;
        size++;
    }

    public static void main(String[] args) {
        TestDemo0118_1 test = new TestDemo0118_1();
        //在调用add的时候,相当于是向上转型
        test.add("aaa");
        //调用get的时候,返回的是Object,就得把Object赋值给String,那就是向下转型 
        String str = (String) test.get(0);
    }
}

其中可以看到,在主函数调用方法的时候,需要用到向上转型和向下转型,增加了代码的冗杂性,降低了代码的安全性

由此彻底引出泛型

泛型

(其实就是在语法层面对Object进行了一些简单的包装,编译过程帮我们自动加上一些编译器的类型检查,自动完成一些类型转换)

public class TestDemo0118_1<E> {
    private E[] data = (E[])new Object[100];
    private int size;

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

    public void add(E elem){
        data[size] = elem;
        size++;
    }

    public static void main(String[] args) {
        TestDemo0118_1<String> test = new TestDemo0118_1<>();
        test.add("aaa");
        String str = test.get(0);
    }
}

以上代码就是使用了泛型,此时在主函数种,实例化对象的时候,才声明了对象是String类型的,这样就避免了向下转型所带来的不安全的问题。 由下面截图可以看出,当实例化对象的时候声明了String类型之后,此时方法的参数自动默认成了String类型

img

同时也可以这样

Book是自己创建的类,也可以使用泛型

img

总之:泛型就是一个模板,所有类型都可以套用