引出问题
在之前的顺序表中,如果定义了一个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类型
同时也可以这样
Book是自己创建的类,也可以使用泛型
总之:泛型就是一个模板,所有类型都可以套用