泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。(引自百科)
下面还是直接贴出代码,看看这个java5的新特性,泛型的使用吧:
package highBasic.generic; /** * 泛型入门 */ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; public class GenericTest { public static void main(String[] args) throws Exception { ArrayList collection =new ArrayList(); //在list中添加元素 collection.add(1); collection.add(1L); collection.add("abc"); int i=(Integer)collection.get(0); //int i1=(Integer)collection.get(1);//----出现异常的语句 /* * 上面这条语句通过强制类型转换,编译器通过了。 * 但是在运行时候,出现了异常: * -----java.lang.ClassCastException: java.lang.Long cannot * -----be cast to java.lang.Integer * 通过这个测试说明两点问题: * 1.在取值的时候需要做类型转换,解决编译器的报错。 * 2.即使编译器通过的情况下,由于集合众的元素的不确定性 * 仍然可能会出现运行时的类型转换异常 * * java5 中就有了这样一个新特性:泛型 */ //------通过==泛型==修改上面的代码: ArrayList<String> collection2 =new ArrayList<String>(); //在list中添加元素 //collection2.add(1);// //collection2.add(1L);//----编译器报错了,原由是这时候规定了只能存储string对象 collection2.add("abc"); String element=collection2.get(0); System.out.println(element); /* * 以上代码是通过泛型修改了集合对象的添加元素和取元素的代码, * 那么有这样的问题如下: * 第一种方法下,无论添加什么类型的数据或对象到集合对象当中 * 都不会出现编译的错误,只是再取的时候出现,但是通过强制类 * 型转换也可以解决编译错误。 * 第二种方法下,限定了集合对象中元素的类型,这时候不能再随 * 意的添加任何不同的类型的数据到集合对象中去了,如果这样做 * 编译过不去。但是只要编译器不报错,那么在运行了只要按照集 * 合在声明的时候指定的类型对象去存放取出来的集合元素,运行 * 时候就不会出现异常了。 * * 那么比较第一种方式和第二种方式(运用java5的新特性 :泛型) * 我们不应该把不确定的错误留在运行时,这样程序的安全性低,也 * 不够健壮。 * * 结论:java5中出现的泛型方式声明集合对象更优了。 * */}}
总结如下:
在不运用泛型的时候,
1.在取值的时候需要做类型转换,解决编译器的报错。 2.即使编译器通过的情况下,由于集合众的元素的不确定性 * 仍然可能会出现运行时的类型转换异常
为了解决以上问题,就出现了代码中所出现的泛型技术。通过限定类型,在编译器阶段就让集合对象不接受非指定类型的对象。这样同时保证了运行阶段不会出现异常。
这就是Java5泛型出现的最基本原因。