泛型出现背景

在jdk1.5之前,集合容器类在声明阶段不能指定这个容器存放的是什么类型的对象,所以只能把容器的对象类型指定为object,但是这种旧的处理方式是有较大的缺点的:任何类型的对象都可以添加到容器中,没有对象类型的约束;而在取出容器中对象的时候只能获取到Object类型的对象,想获取到具体的对象类型则需要强转,这容易出现ClassCastException。总的来说,对集合的存储类型不指定是一种不太好的行为,为此才出现了泛型。如:

  1. @org.junit.Test
  2. public void t6() {
  3. List list = new ArrayList();
  4. //可以添加各种类型的对象
  5. list.add("666");
  6. list.add(new Phone());
  7. //索引为1的元素类型并不是String
  8. String s = (String) list.get(1);
  9. }

image.png
jdk1.5之前,容器的操作除了元素的类型不确定之外,其它的部分都是确定的,如:如何添加这个元素、如果删除这个元素。这个时候把元素的类型设计成一个参数,而这个类型参数就是泛型了。
如:指定List集合只能操作String类型的对象:
image.png

泛型的定义和目的

定义

允许在定义类、接口时通过一个标识来标识类中的某个属性的类型或者是某个方法的返回值及参数类型,而这个参数类型在使用时(如:继承该类或实现该接口,用这个类型声明变量、创建对象)确定。泛型的一种较为准确的说法就是为了参数化类型,或者说可以将类型当作参数传递给一个类或者是方法

目的

Java泛型是一种语法糖,在编译阶段完成类型的转换的工作,避免在运行时强制类型转换而出现ClassCastException(类型转化异常)。使用泛型主要的优点就是能够在编译期而不是运行时检测出类型相关的异常。
下面是泛型的优点:

  • 与普通的 Object 代替一切类型这样简单粗暴而言,泛型使得数据的类别可以像参数一样由外部传递进来。它提供了一种扩展能力。它更符合面向抽象开发的软件编程宗旨。
  • 当具体的类型确定后,泛型又提供了一种类型检测的机制,只有相匹配的数据才能正常的赋值,否则编译器就不通过。所以说,它是一种类型安全检测机制,一定程度上提高了软件的安全性防止出现低级的失误。
  • 泛型提高了程序代码的可读性,不必要等到运行的时候才去强制转换,在定义或者实例化阶段,因为 Cache这个类型显化的效果,程序员能够一目了然猜测出代码要操作的数据类型。

image.pngimage.png