【问题标题】:Typing Scala collections键入 Scala 集合
【发布时间】:2011-06-13 18:44:03
【问题描述】:

我想通过制作一个非常通用的前缀树来学习新的 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 也应该是该类型。

出了什么问题,可以修复吗?

【问题讨论】:

    标签: scala collections typing trie prefix-tree


    【解决方案1】:

    好吧,问题在于MapLike 定义了一个返回Thisempty,但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 的类型。代码无法编译,因为它缺少抽象方法,但这是另一回事。

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多