Scala中sealed关键字可以修饰类和特质,其主要有2个作用:
- 其修饰的trait,class只能在当前文件里面被继承;
- 在检查模式匹配的时候,用sealed修饰目的是让scala知道这些case的所有情况,scala就能够在编译的时候进行检查,看你写的代码是否有没有漏掉什么没case到,减少编程的错误。
比如下面的代码,声明了两个trait,其中Test2是sealed声明:
trait Test1{}
sealed trait Test2{}
case class A1() extends Test1{}
case class B1() extends Test1{}
case class C1() extends Test1{}
case class A2() extends Test2{}
case class B2() extends Test2{}
case class C2() extends Test2{}
运行代码测试:
object TraitTest {
def main(args: Array[String]) {
val x:Test1 = new B1()
x match {
case x @ A1() => println("A1")
case x @ B1() => println("B1")
}
}
}
上述代码运行无异常
object TraitTest1 {
def main(args: Array[String]) {
val x:Test2 = new B2()
x match {
case x @ A2() => println("A2")
case x @ B2() => println("B2")
// case x @ C2() => println("C2")
}
}
}
上述代码如果注释掉的代码没有打开,则会如下警告:
Warning:(35, 5) match may not be exhaustive.
It would fail on the following input: C2()
x match {