斯卡拉的密封抽象类与抽象类
sealed abstract
和abstract
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 }
如果Tree
被sealed
,那么编译器会警告,除非最后一行被取消注释。