Scala 的密封抽象类 vs 抽象类

sealed abstractabstract Scala 类的区别是什么?

23332 次浏览

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

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

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,那么编译器会发出警告,除非最后一行被取消注释。