在jdk1.4版本之前,定义容器可以存储任意类型的对象,但是取出时,如果使用了具体元素的方法,需要向下转型的动作。因为元素类型的不一致,会导致运行时, ClassCastException 类型转换异常。问题原因是,在定义集合时,并没有明确集合中的元素的具体类型。借鉴数组的定义方式就可以避免这个问题。所以jdk1.5版本以后,出现了一个解决机制,就在定义容器时,直接明确容器的元素类型。ArrayList<String> a = new ArrayList<String>();
这是就是泛型的表现,通过<>格式来使用,其实泛型就是使用到了带有<>的类和接口时,传递需要操作的对象的类型即可,其实就传递类型参数。
什么时候写泛型
最简单一种体现,只要使用了带有<>的类的接口,就是指定具体对象类型。
泛型的好处:
1、将运行时出现的 ClassCastException 问题,在编译时期给解决了,运行就安全了
2、避免了强制转换的麻烦了。
所以泛型就是jdk1.5后出现了一个安全机制。
泛型是编译时期的安全机制
泛型的擦除:
编译时,通过泛型机制,编译器多了对元素类型进行检查的步骤。如果检查通过,产生的class文件是不带有的泛型的:泛型的擦除。
泛型的补偿:
在对元素存储的时候,可以完成类型的判断。可是在对元素取出的时候,怎么用指定的类型来接收呢?jvm在运行时,会获取元素的类型,并用该类型对元素进行转换即可。
泛型在表现上的特点:
泛型类:
将泛型定义在自定义类上,这个类称为泛型类。
所以泛型替代了Object的同时在编译时期更安全,省去了强转的麻烦。
什么时候使用泛型类呢?
当类中的要操作的引用数据类型不确定的时候,以前使用的共性类型Object,现在可以使用泛型来解决。
泛型方法:
类中的方法操作的类型不确定时,可以将泛型定义在方法上。
什么时候使用泛型方法?
当方法操作的引用数据类型不确定的时候,就使用泛型方法。
*.如果方法是静态的,是无法访问类上定义的泛型的,如果该方法还需要泛型,必须将泛型定义在方法上。 |