我想通过制作一个非常通用的前缀树来学习新的 Scala 集合框架。不仅键和值必须是参数,而且每个节点中使用的映射的类型也必须是参数。所以我尝试了这个:
import collection.immutable.MapLike
class PrefixMap[+M[K1,+V1] <: Map[K1,V1] with MapLike[K1,V1,M[K1,V1]],K,+V](val content: Option[V], val children: M[K,PrefixMap[M,K,V]])
extends Map[Iterable[K],V]
with MapLike[Iterable[K],V,PrefixMap[M,K,V]] {
override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, children.empty)
}
但这不会编译:
PrefixMap.scala:19: error: type mismatch;
found : scala.collection.immutable.Map[K,PrefixMap[M,K,V]]
required: M[K,PrefixMap[M,K,V]]
override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, children.empty)
^
one error found
这让我很困惑。我可以从文档中看到 MapLike 有一个返回“This”的空。因此,由于 children 是 M[K,PrefixMap[M,K,V]] 类型,children.empty 也应该是该类型。
出了什么问题,可以修复吗?