Scala的密封抽象与抽象类

时间:2010-06-13 15:30:47

标签: scala class abstract sealed

sealed abstractabstract Scala类有什么区别?

2 个答案:

答案 0 :(得分:81)

不同之处在于密封类的所有子类(无论是否抽象)必须与密封类位于同一文件中。

答案 1 :(得分:75)

作为answered,密封类(抽象或非抽象)的所有直接继承子类必须位于同一文件中。这样做的一个实际结果是编译器可以警告模式匹配是否不完整。例如:

sealed abstract class Tree
case class Node(left: Tree, right: Tree) extends Tree
case class Leaf[T](value: T) extends Tree
case object Empty extends Tree

def dps(t: Tree): Unit = t match {
  case Node(left, right) => dps(left); dps(right)
  case Leaf(x) => println("Leaf "+x)
  // case Empty => println("Empty") // Compiler warns here
}

如果Treesealed,则编译器会发出警告,除非最后一行被取消注释。