【发布时间】: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 上提出了一个相关问题,请随时在那里回答。