Scala面试题更新 2026-08-05

请说明在 Scala 里,case class 如何与模式匹配结合使用,并给出一个示例代码片段来演示这一用法。

编码实现技术原理Scala

考察说明

考查对 Scala case class 在模式匹配中应用的理解和实际使用能力。

回答思路

  1. 【回答框架 1】case class 默认实现了 equals、hashCode 和 toString,且其伴生对象提供了 apply 和 unapply 方法,使得模式匹配能够直接抽取构造参数。匹配时通过 unapply 返回的参数元组与模式中的绑定变量绑定。
  2. 【回答框架 2】基本用法:定义 case class Person(name: String, age: Int),然后在 match 表达式中写 case Person(n, a) => ...,n 和 a 会绑定到对应的字段值。支持嵌套模式匹配和类型检查,如 case p @ Person(_, a) if a > 18 => ...,其中 p 绑定整个对象,守卫条件可进一步过滤。
  3. 【回答框架 3】模式匹配是表达式,需要覆盖所有可能情况;当没有匹配时抛出 MatchError,因此建议添加默认分支 case _ => ...。密封类(sealed)与 case class 配合可让编译器检查匹配的穷尽性。
  4. 【回答框架 4】case class 常用于代数数据类型(ADT),例如定义 sealed trait Animal 和 case class Dog(name: String) extends Animal,然后模式匹配所有子类型来实现行为分派。
  5. 【关键点 1】case class 自动生成 unapply,从而支持构造器模式匹配。
  6. 【关键点 2】模式匹配支持变量绑定、类型测试和守卫条件。
  7. 【关键点 3】使用 sealed 和 case class 可实现穷尽性检查。
  8. 【关键点 4】匹配需要覆盖所有情况,否则可能抛 MatchError。
  9. 【易错点 1】忘记处理非穷尽匹配导致运行时 MatchError。
  10. 【易错点 2】守卫条件误用可能导致匹配顺序影响结果,注意守卫不匹配时继续尝试后续分支。
  11. 【易错点 3】case class 的模式匹配依赖 unapply 返回元组,若字段数量多时注意参数顺序。