簡體   English   中英

未為SortedMap找到為Map定義的隱式類型類

[英]Implicit type class defined for Map not found for a SortedMap

在以下代碼中(從我嘗試將Quicklens支持擴展到SortedMap提取), pimped 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]設置邊界的地方M[KT, TT] <: scala.collection.immutable.Map[KT, TT] 將兩個邊界都更改為scala.collection.Map 或者,您可能打算使用scala.collection.immutable. SortedMap scala.collection.immutable. SortedMap

如果您希望它可以在所有類型的Map(即可變的,不可變的和集合的Map)上運行,我不確定它是否可行。 或者可能是使用包裝器進行隱式轉換,但這很丑陋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM