【问题标题】:Implicit type class defined for Map not found for a SortedMap未为 SortedMap 找到为 Map 定义的隐式类型类
【发布时间】:2016-05-15 10:41:13
【问题描述】:

在以下代码中(摘自我尝试将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)
}

【问题讨论】:

  • 如果有办法摆脱asInstanceOf,我已经在Code Review 上提出了一个相关问题,请随时在那里回答。

标签: scala typeclass implicit


【解决方案1】:

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

您已经为M[KT, TT] &lt;: scala.collection.immutable.Map[KT, TT] 设置了界限。将两个边界都更改为scala.collection.Map,它就可以工作了。或者您可能打算使用scala.collection.immutable. SortedMap

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

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多