[英]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.