泛型

在这份教学里,我们最后要探讨的 Scala 特性是泛型。Java 程序员应该相当清楚在 Java 1.5 之前缺乏泛型所导致的问题。

泛型指的是能够将类型也作为程序参数。举例来说,当程序员在为链表写函数库时,它必须决定列表的元素类型为何。由于这列表是要在许多不同场合使用,不可能决定列表的元素类型为如Int 一类。这样限制太多。

Java 程序员采用所有对象的父类Object。这个解决办法并不理想,一方面这并不能用在基础类型 (intlongfloat 之类),再来这表示必须靠程序员手动加入大量的动态转型。

Scala 借由可定义泛型类 (跟函数) 来解决这问题。让我们借由最简单的类容器来观察这点:引用,它可以是空的或者指向某类型的对象。

  1. class Reference[T] {
  2. private var contents: T = _
  3. def set(value: T) { contents = value }
  4. def get: T = contents
  5. }

Reference 带有一个类型参数T,这个参数会是容器内元素的类型。此类型被用做contents 变量的类型、set 函数的对象类型、get 函数的回传类型。

上面代码使用的 Scala 变量语法应该不需要过多的解释。值得注意的是赋与该变量的初始值是_,该语法表示预设值。数值类型预设值是0,Boolean 类型是falseUnit 类型是() ,所有的对象类型是null

为了使用Reference 类型,我们必须指定T,也就是这容器所包容的元素类型。举例来说,创造并使用该容器来容纳整数,我们可以这样写:

  1. object IntegerReference {
  2. def main(args: Array[String]) {
  3. val cell = new Reference[Int]
  4. cell.set(13)
  5. println("Reference contains the half of " + (cell.get * 2))
  6. }
  7. }

如例子中所展现,并不需要先将get 函数所回传的值转型便能当做整数使用。同时因为被声明为储存整数,也不可能存除了整数以外的东西到这一个容器中。