斯卡拉的密封抽象类与抽象类

sealed abstractabstract Scala类有什么区别?

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

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

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