用一个例子告诉你 什么是scala中的密封类(sealed class)

密封类限制其子类只能在同一文件内定义,用于在模式匹配中提供编译时的完整分支检查,防止MatchError,提升代码健壮性。可以使用@unchecked注解关闭这种检查。建议在设计用于模式匹配的类时考虑使用密封类。
摘要由CSDN通过智能技术生成

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 修饰即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值