购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

参数化类型(泛型)

在Java 5之前,Java语言的集合所支持的是通用类型Object。因为单根层次结构决定了所有对象都属于Object类型,所以一个持有Object的集合就可以持有任何对象 ,这就使得集合十分易于复用。

为了使用这样一个集合,你要将对象引用添加到集合中,然后再将其取出。但由于该集合只能持有Object类型,因此当你添加一个对象引用到集合时,该对象会向上转型为Object,从而失去了其原本的特征。当你需要将其取出时,会获得一个Object类型的对象引用,这就不是当初的类型了。那么问题来了,当初被放入集合中的对象如何才能转换回原来的类型呢?

这里需要再一次用到转型,只不过这次不是向上转为更通用的类型,而是向下转为更具体的类型,这种转型叫作“向下转型”(downcasting)。当使用向上转型时,我们知道Circle对象属于Shape类型,所以这种向上转型是安全的。但是反过来,我们并不知道一个Object对象实际上是Circle还是Shape类型,所以除非你明确知道对象的具体类型是什么,否则向下转型是不安全的。

不过,也不是说向下转型一定是危险的。如果向下转型失败,你会得到一个运行时的错误提示,这叫作“异常”(exception),后面你很快就会看到相关的介绍。不过话说回来,当你从集合中获取对象引用时,需要通过一些方法明确对象的类型,这样的话才能正确地向下转型。

当一段程序在运行时,向下转型和与其关联的运行时检查都会耗费额外的时间,同时程序员也需要关注这种向下转型。为什么我们创建的集合就不能明确地知道所包含的对象类型呢?如果知道的话,我们就不再需要向下转型,也避免了在此期间可能出现的报错。这个问题的解决方案就是“参数化类型”(parameterized type)机制。一个被参数化的类型是一种特殊的类,可以让编译器自动适配特定的类型。比如,对于参数化的集合而言,编译器可以将集合定义为只接受放入Shape的对象,因此从集合也只能取出Shape对象。

Java 5新增的主要特性之一是支持参数化类型,也叫作“泛型”(generics)。你可以通过在一对尖括号中间加上类名来定义泛型,比如,你可以这样创建一个放置Shape对象的ArrayList:

泛型带来的好处促使许多标准库组件都进行了相应的调整。此外,你在本书所列举的许多代码示例中都会看到泛型的作用。 wFmaTJmCvzi3wAHubiuyUXzn5JjExMlC5Pw+dXFf58IiQBAaFSAdcbsFA9bIV/ao

点击中间区域
呼出菜单
上一章
目录
下一章
×