1. 什么是密封类(sealed class)
语法:
sealed class(字段列表) {}
功能:
密封类的子类 必须 和密封类 定义在同一个scala文件中
通俗的讲 就是将 密封类及其子类 密封在同一个文件中
现象(编译报错):
2. 密封类有什么用?
先思考一个问题:
当在match表达式中 使用构造方法模式时
能否让scala编译器自动感知到缺失了哪些可能出现的分支
避免代码出现 MatchError的发生,增强代码的健壮性
密封类就是帮助scala编译解决上面的问题的
当 选择器为密封类 分支中匹配 密封类子类时
scala编译器 会自动标示出缺失的模式组合
2.1 分支缺失检查
test("密封类 帮助 模式匹配检查缺失分支") {
sealed abstract class Car
case class Benz(id: Int, version: String) extends Car
case class BMW(name: String) extends Car
case class Audi(id: Int) extends Car
def matchCar(c: Car) = c match {
case Benz(_,_) => println(s"It is Benz : ${c}")
case BMW(_) => println(s"It is BMW : ${c}")
}
}
2.2 关闭分支缺失检查
可以使用 @unchecked 注解 关闭编译器对缺失分支的检查
3. 建议
如果你的类打算被用于模式匹配,那么你应该考虑把它们做成密封类
只需要将 样例类的基类用sealed 修饰即可