如何在 Scala 中模式匹配对象

How to pattern match objects in Scala

我正在尝试对对象列表使用模式匹配。该方法接受 queue: List[ScheduleChangeEvent]ScheduleChangeEvent 是具有 4 个不同 final case classsealed trait。因此,根据列表包含的 ScheduleChangeEvent 类型,我需要做一些不同的事情。

我执行了以下操作:

queue match {

      case lsc: List[LocationSettingsChange] =>
        ...
      case lwhc: List[LocationWorkHoursChange] =>
        ...
      case tpc: List[TeamParameterChange] =>
        ...
      case mptc: List[MemberPrimaryTeamChange] =>
        ... 
    }

但是,我收到警告 unreachable code [warn] case tpc: List[LocationWorkHoursChange] =>。而且无论传入队列是什么,它总是去 case lac。我明白警告是什么,但我不明白为什么会收到警告。

这是因为在运行时你有擦除。这意味着 jvm 没有泛型的类型参数值。 IE。而不是 List[LocationSettingsChange]List[LocationWorkHoursChange] 你在运行时只有 List。你可以用非空列表做的事情是一种内省 case head :: tail if head.isInstanceOf[LocationSettingsChange] 或者如果你有一个提取器。 通常尽量避免你应该这样做的情况,如果你可以通过将模式匹配从列表传递到列表的元素来做类似的事情:

list.map { 
  case x: LocationSettingsChange => ???
  case x: LocationWorkHoursChange=> ???
  case x: TeamParameterChange=> ???
  case x: MemberPrimaryTeamChange=> ???
}

通过这样做你不会有任何擦除问题,但如果你仍然需要它,你可以使用类型标签并以运行时性能损失为代价匹配它们,这里有更多描述:https://docs.scala-lang.org/overviews/reflection/typetags-manifests.html