泛型
在这份教学里,我们最后要探讨的 Scala 特性是泛型。Java 程序员应该相当清楚在 Java 1.5 之前缺乏泛型所导致的问题。
泛型指的是能够将类型也作为程序参数。举例来说,当程序员在为链表写函数库时,它必须决定列表的元素类型为何。由于这列表是要在许多不同场合使用,不可能决定列表的元素类型为如Int
一类。这样限制太多。
Java 程序员采用所有对象的父类Object
。这个解决办法并不理想,一方面这并不能用在基础类型 (int
、long
、float
之类),再来这表示必须靠程序员手动加入大量的动态转型。
Scala 借由可定义泛型类 (跟函数) 来解决这问题。让我们借由最简单的类容器来观察这点:引用,它可以是空的或者指向某类型的对象。
class Reference[T] {
private var contents: T = _
def set(value: T) { contents = value }
def get: T = contents
}
类Reference
带有一个类型参数T
,这个参数会是容器内元素的类型。此类型被用做contents
变量的类型、set
函数的对象类型、get
函数的回传类型。
上面代码使用的 Scala 变量语法应该不需要过多的解释。值得注意的是赋与该变量的初始值是_
,该语法表示预设值。数值类型预设值是0,Boolean
类型是false
,Unit
类型是()
,所有的对象类型是null
。
为了使用Reference
类型,我们必须指定T
,也就是这容器所包容的元素类型。举例来说,创造并使用该容器来容纳整数,我们可以这样写:
object IntegerReference {
def main(args: Array[String]) {
val cell = new Reference[Int]
cell.set(13)
println("Reference contains the half of " + (cell.get * 2))
}
}
如例子中所展现,并不需要先将get
函数所回传的值转型便能当做整数使用。同时因为被声明为储存整数,也不可能存除了整数以外的东西到这一个容器中。