键入Scala集合

我想通过制作一个非常通用的前缀树来学习新的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”。因此,由于子类型为M [K,PrefixMap [M,K,V]],因此children.empty也应属于该类型。 出了什么问题,可以修补吗?     
已邀请:
好吧,问题是
MapLike
定义了一个返回
This
empty
,但是
Map.empty
返回
Map
! 试试,例如:
override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, (children: MapLike[K,PrefixMap[M,K,V],M[K,PrefixMap[M,K,V]]]).empty)
这将编译,因为你隐藏了
Map
的类型。代码将无法编译,因为它缺少抽象方法,但这是另一回事。     

要回复问题请先登录注册