17.scala的泛型类

泛型类指能够接受类型参数的类。泛型类在集合类中被普遍使用。安全

定义一个泛型类

泛型类使用方括号 [] 来接受类型参数。一个惯例是使用字母 A 做为参数标识符,固然你能够使用任何参数名称。app

  •  
class Stack[A] {  private var elements: List[A] = Nil  def push(x: A) { elements = x :: elements }  def peek: A = elements.head  def pop(): A = {    val currentTop = peek    elements = elements.tail    currentTop  }}

上面的 Stack 类的实现中接受类型参数 A。这表示其内部的列表,var elements: List[A] = Nil,只可以存储类型 A 的元素。方法 def push 只接受类型 A 的实例对象做为参数(注意:elements = x :: elements 将 elements 放到了一个将元素 x 添加到 elements 的头部而生成的新列表中)。ide

使用

要使用一个泛型类,将一个具体类型放到方括号中来代替 A。ui

  •  
val stack = new Stack[Int]stack.push(1)stack.push(2)println(stack.pop)  println(stack.pop)

实例对象 stack 只能接受整型值。然而,若是类型参数有子类型,子类型能够被传入:对象

  •  
class Fruitclass Apple extends Fruitclass Banana extends Fruit
val stack = new Stack[Fruit]val apple = new Appleval banana = new Banana
stack.push(apple)stack.push(banana)

类 Apple 和类 Banana 都继承自类 Fruit,因此咱们能够把实例对象 apple 和 banana 压入栈 Fruit 中。继承

注意:泛型类型的子类型是*不可传导*的。这表示若是咱们有一个字母类型的栈 Stack[Char],那它不能被用做一个整型的栈 Stack[Int]。不然就是不安全的,由于它将使咱们可以在字母型的栈中插入真正的整型值。结论就是,只有当类型 B = A 时, Stack[A] 是 Stack[B] 的子类型才成立。由于此处可能会有很大的限制,Scala 提供了一种 类型参数注释机制 用以控制泛型类型的子类型的行为。element

相关文章
相关标签/搜索