我们之前写过的顺序表,只能保存int类型的元素,但是在实际应用中往往需要保存多种类型的元素,那么该如何解决这个问题呢
首先我们知道父类引用可以引用子类对象,而Object又是所有类的父类,那么我们就可以把顺序表中的int类型改为Object类型,这样的话我们的Object类型就可以指向除内置类型外的任何类型的对象了。
代码示例:
class MyArr{ private Object[] arr = new Object[100]; private int size; public void add(Object x){ arr[size] = x; size++; } public Object get(int index){ return arr[index]; } } public class Demo { public static void main(String[] args) { MyArr m = new MyArr(); m.add("haha"); Integer a = 10 ; m.add(a); String o =(String) m.get(0); System.out.println((o)); } }
注:
1:内置类型不属于Object,所以要想存放内置类型,需要转化成包装类的形式。
2.从Object类型的数组中获取元素的时候需要进行向下转型,子类引用不会引用父类对象
3。添加元素的整个过程相当于向上转型,父类Object类型来指向子类对象
我们会发现,利用Object来操作比较麻烦,因为既要向上转型,又要向下转型,而且向下转型的时候还需要判断一下当前父类引用是否指向的是对应的子类对象。
为了能更方便的解决这个问题,我们可以使用泛型
泛型引入的背景主要就是为了能够写一个类或者方法就能支持多种不同类型的对象。
示例代码:
class MyArr<E>{ private E[] arr =(E[]) new Object[100]; private int size; public void add(E x){ arr[size] = x; size++; } public E get(int index){ return arr[index]; } } public class Demo { public static void main(String[] args) { MyArr<String> m = new MyArr<>(); m.add("haha"); } }
注:
1.尖括号里面的E代表的是泛型参数,只有在实例化这个顺序表的时候才能确定下来,可以看坐是Object
2.E这样的泛型参数不能被初始化,因为还不确定E的最终类型是什么,需要初始化为Object类型然后强转为E类型
3.只要是引用类型,都可以通过泛型参数放入对应集合中
4.可以理解为在编译代码过程中,直接把泛型参数当成了Object,只不过编译器自动加上了类型转换操作。运行的时候就都是当做object来处理的
泛型编程的作用就是让Java中的集合可以存放任意类型的元素,你需要存放什么类型,就把泛型参数修改成什么类型。