为 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(即可变、不可变和集合),我不确定它是否实用。或者可能使用包装器进行隐式转换,但这会很难看。
在以下代码中(从我尝试将 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(即可变、不可变和集合),我不确定它是否实用。或者可能使用包装器进行隐式转换,但这会很难看。