我正在使用通用抽象类List[+T]
实现我自己的List
集合。我想添加一个map
函数,它根据给定的函数改变列表:
abstract class List[+T] {
def map[U>:T](f: T => U): List[U] = this match {
case null => this
case x :: xs => f(x) :: xs.map(f)
}
}
我在x :: xs
中得到以下错误:
构造函数不能实例化为期望的类型。find Scala.collection.immutable .::required List[T]
首先你可以阅读scala集合的架构链接
总而言之,如果您想完全集成一个新的集合类进入框架需要注意以下几点:
- 决定集合应该是可变的还是不可变的
- 为集合选择正确的基本特征。
- 继承正确的实现trait来实现大多数收集操作。
- 如果你想让map和类似的操作返回你的集合类型的实例,在你的类的伴侣对象中提供一个隐式的CanBuildFrom。
地图在traversableelike中的实现:
def map[B, That](f: Elem => B)
(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(this)
this.foreach(x => b += f(x))
b.result
}
使用::
,您正在尝试将自己的List
与Scala标准库List
相匹配。如果希望使用模式匹配,则需要定义自己的提取器。
你可以在Scala新手指南第1部分:提取器中阅读更多关于中缀提取器的信息,段落中缀操作模式。
另一个很好的解释可以在The Scala List extractor demystified中找到:
事实证明,有一个名为
::
的case类(在scala.collection.immutable
包中)扩展了List
。case类为您提供的众多巧妙功能之一,是一个带有unapply方法的合成伴侣对象,该方法可以解构该类型的实例