【发布时间】:2021-11-11 15:10:15
【问题描述】:
我正在尝试对对象列表使用模式匹配。该方法采用queue: List[ScheduleChangeEvent]。 ScheduleChangeEvent 是一个 sealed trait,有 4 个不同的 final case class。因此,根据列表包含的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。我明白警告是什么,但我不明白为什么会收到警告。
【问题讨论】:
-
您正在点击类型擦除,您想要做的事情并不容易完成并且通常不安全。您可以对列表的每个元素进行模式匹配。
-
是的,我也收到了擦除警告。问题是我真的需要整个队列,是什么让它不安全?谢谢回复。 @LuisMiguelMejíaSuárez
-
虽然我相信 Shapeless 确实提供了该功能,但您无法真正在运行时检查
List是否只有一些子类型,这种方式既简单又安全。无论如何,您可以尝试检查列表中的所有元素是否是您的 ADT 的特定实例,但这会很慢并且在某种程度上不安全,或者甚至更好地为您的队列创建一个包装器 ADT。检查这个:scastie.scala-lang.org/BalmungSan/FUVXpbeuR7eqMxgB1887rw/4
标签: list scala pattern-matching case-class unreachable-code