通过之前的学习,可以了解到集合可以存储任何类型的对象,但是当把一个对象存入集合后,集合会“忘记”这个对象的类型,将该对象从集合中取出时,这个对象的编译类型就变成了Object 类型。换句话说,在程序中无法确定一个集合中的元素到底是什么类型的。那么在取出元素时,如果进行强制类型转换就很容易出错。
泛型的基本概念:泛型是Javase1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
Java 语言引入泛型的好处是安全简单。
在Javase1.5 之前,没有泛型的情况下,通过对类型Object 的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的,对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。以ArrayList 集合为例。
语法:
ArrayList<参数化类型> list = new ArrayList<参数化类型>();
使用:
ArrayList<String> list = new ArrayList<String>();
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。
【例7.23】下面通过一个案例了解泛型的必要性,如文件7-23 所示。
文件7-23 Example23.java
执行结果
【例7.24】通过下面的案例演示Java-->反射机制,如文件7-24 所示。
文件7-24 Example24.java
执行结果
(www.xing528.com)
【例7.25】下面通过一个案例来演示泛型中强制类型转换出错情况,如文件7-25 所示。
文件7-25 Example25.java
执行结果
泛型可以限定方法操作的数据类型,在定义集合类时,使用“<参数化类型>”的方式指定该类中方法操作的数据类型,具体格式如下:
接下来,对文件7-25 中的第4 行代码进行修改,如下所示:
ArrayList<String>list = new ArrayList<String>();//创建集合对象并指定泛型为String
上面这种写法就限定了 ArrayList 集合只能存储 String 类型元素,将改写后的程序在Eclipse 中编译时就会出现错误提示,如图7.8 所示。
图7.8 错误提示
【例7.26】下面使用泛型再次对文件7-25 进行改写,如文件7-26 所示。
文件7-26 Example26.java
执行结果
使用泛型有以下几个优点:
① 类型安全;
② 向后兼容;
③ 层次清晰;
④ 性能较高,用GJ(泛型JAVA)编写的代码可以为Java 编译器和虚拟机带来更多的类型信息,这些信息对Java 程序做进一步优化提供条件。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。