为 SortedMap 找不到为 Map 定义的隐式类型 class

Implicit type class defined for Map not found for a SortedMap

在以下代码中(从我尝试将 Quicklens 支持扩展到 SortedMap 中提取)拉皮条的 upd 可用于 Map,但不适用于SortedMap.

为什么 - 以及如何更改代码以便 UpdatedMap 处理 SortedMap(以及其他可能的 Map 子类)?

object TImpl extends App {

  trait UpdatedTrait[A, K, T] {
    def upd(k: K, t: T): A
  }

  trait UpdatedFunctor[A, K, T] {
    def upd(a: A, k: K, t: T): A
  }

  implicit class UpdatedMap[M[KT, TT] <: Map[KT, TT], K, T](a: M[K, T])(implicit f: UpdatedFunctor[M[K, T], K, T]) {
    def upd(k: K, t: T) = {
      f.upd(a, k, t)
    }
  }

  implicit def mapUpdatedFunctor[M[KT, TT] <: Map[KT, TT], K, T] = new UpdatedFunctor[M[K, T], K, T] {
    override def upd(a: M[K, T], k: K, t: T): M[K, T] = {
      a.updated(k, t).asInstanceOf[M[K, T]]
    }
  }

  val m = Map("A" -> "1")
  val sm = collection.SortedMap("A" -> "1")

  val mt = m.upd("A", "2")
  val smt: collection.SortedMap[String, String] = sm.upd("A", "2")

  println(mt)
  println(smt)
}

仅仅是因为 SortedMap 扩展了 scala.collection.Map

您为 M[KT, TT] <: scala.collection.immutable.Map[KT, TT] 设置了界限。将两个边界都更改为 scala.collection.Map 并且它有效。或者您可能打算使用 scala.collection.immutable. SortedMap

如果您希望它 运行 用于所有类型的 Map(即可变、不可变和集合),我不确定它是否实用。或者可能使用包装器进行隐式转换,但这会很难看。