【发布时间】:2021-07-11 23:08:51
【问题描述】:
我不明白为什么以下 scala 代码无法编译:
sealed trait A
case class B() extends A {
def funcB: B = this
}
case class C() extends A {
def funcC: C = this
}
def f[T <: A](s:T): T = s match {
case s: B => s.funcB
case s: C => s.funcC
}
可以将f替换为
def f[T <: A](s:T): A = s match {
case s: B => s.funcB
case s: C => s.funcC
}
然后在调用f 时转换为子类型,例如使用asInstanceOf。但是我希望能够构造一个函数来统一一些以前定义的方法,并让它们是类型稳定的。谁能解释一下?
另外,请注意以下f 也可以编译:
def f[T <: A](s:T): T = s match {
case s: B => s
case s: C => s
}
【问题讨论】:
-
编译器无法知道
s将是A类型。在某些情况下可行,但我不记得规则。通常,更简单的方法是改用typeclass。
标签: scala generics polymorphism type-parameter return-current-type