【发布时间】:2020-11-19 03:42:10
【问题描述】:
我正在编写一些使用模式匹配的代码。在测试中我发现了一个奇怪的结果:
object Example extends App {
trait Human {
def sing(): Unit
}
case class Son(name: String) extends Human {
override def sing(): Unit = println("son " + name)
}
case class Daughter(name: String) extends Human {
override def sing(): Unit = println("daughter " + name)
}
val jack = Son("jack")
val sonia = Daughter("sonia")
def f1(lst: List[Human]) = {
lst match {
case a: List[Son] => println("human is son")
case b: List[Daughter] => println("human is daughter")
}
}
f1(List(jack))
f1(List(sonia))
}
这两个都打印“人是儿子”。有没有解决的办法?我可以看到编译器将 Son 和 Daughter 都匹配到 Human。但是有没有办法让它区分两者?
【问题讨论】:
-
由于类型擦除你不能检查
lst是List[Son]还是List[Daughter]你只能检查它是否是一个列表(你已经知道了,所以它没用)。你真正想做的是什么?可能有解决方法。 -
感谢@LuisMiguelMejíaSuárez,我基本上是在重构一些现有代码以消除冗余。其中一个功能基本上采用 List[Human]。我想以某种方式将模式匹配到两个代码路径中;一份给儿子,一份给女儿。但我会看看我是否可以尝试另一种方式 - 似乎擦除不允许我这样做。
-
有一篇关于它的好帖子。 gist.github.com/jkpl/…
-
@finite_diffidence 如果您想编辑问题(或打开一个新问题),并提供有关潜在问题的更多详细信息,我们或许可以提出替代方案。
-
谢谢我会打开一个新的,虽然我想我设法通过删除一个列表按照你的建议重构了代码。感谢您的反馈,有时只需与某人交谈即可解决问题!
标签: scala pattern-matching traits case-class