【发布时间】:2023-03-13 12:37:01
【问题描述】:
我需要一个带有方法的隐式类,它可以让我合并任何可能具有重复键和多态值的不可变映射类型 (<: Map)。我无法弄清楚如何让隐式类使用嵌套的多态类型并隐式工作(类似于A <: Map[_, B], B <: Combinable[B])。
我可以让它适用于所有 Map 类型...或多态值...但不能同时适用于两者。如果没有在隐式类中找不到方法的错误,我无法弄清楚如何组合成一个隐式类。
比如说……
trait Combinable[A] {
this: A =>
def combine(that: A): A
def combine(that: Option[A]): A = that match {
case Some(a) => this combine a
case None => this
}
}
假设我有一堂课……
case class Meta(???) extends Combinable[Meta] {
def combine(that: Meta): Meta = ???
}
现在,如果我有一个标准的不可变 Map,那就小菜一碟了……效果很好。
implicit class CombinableMaps[A <: Combinable[A]](val m1: Map[String, A]) {
def mergeMaps(m2: Map[String, A]): Map[String, A] = {
m1 ++
m2.map { case (k,v) => k -> (v combine m1.get(k)) }
}.asInstanceOf[Map[String, A]]
}
但如果我希望它也适用于 TreeMaps 和 SortedMaps 以及其他什么?
implicit class CombinableMaps[B <: Combinable[B], A <: Map[String,B]](val m1: A) {
def mergeMaps(m2: A): A = {
m1 ++
m2.map { case (k,v) => k -> (v combine m1.get(k)) }
}.asInstanceOf[A]
}
这编译没有错误,但是当我尝试使用mergeMap 方法时,它会抛出error: value mergeMaps is not a member of Map[String,Meta]。
我尝试了一个变体,其中B 是传递给A 的类型,例如A[B]... 再次编译(如果我导入了scala.language.higherKinds)但没有被应用。
允许这种嵌套多态吗?我什至不知道要搜索什么字词。
提前致谢。
【问题讨论】:
标签: scala polymorphism implicit