在使用case 类来做模式匹配时,你可能想让编译器帮你确保已经列出了所有可能的选择。那么通常就要将通用超类声明为sealed:
sealed abstract class Amount
case class Dollar(value:Double) extends Amount
case class Rnb(value:Double) extends Amount
case class Currency(value:Double,unit:String) extends Amount
密封类的所有子类都必须在该密封类相同的文件中定义。比如要是想添加一个欧元类:
case class Euro(value:Double) extends Amount
他们必须在Amount被声明的那个文件中完成。
如果类是密封的,那么在编译期所有的子类都是可知的,因而编译器可以检查模式匹配语句的完整性。
测试:
object TestSealed extends App {
def matchMoney(money: Amount) = money match {
case Dollar(value) => println(value + " $")
case Rnb(value) => println(value + " ¥")
case Currency(value, unit) => println(value + " " + unit)
case Euro(value) => println(value + " €")
}
val amounts = List(Rnb(100), Dollar(9), Euro(10), Currency(12, "£"))
for (amount <- amounts)
matchMoney(amount)
}
结果:
100.0 ¥
9.0 $
10.0 €
12.0 £