扩展特定成员类型的scala集合

时间:2013-04-29 23:58:26

标签: scala scala-collections scala-2.10

我想做点什么

class Pack extends collection.immutable.List[Dog]{
  def pullSled() = //...
}

但是Scala编译器告诉我

illegal inheritance from sealed class List

这在Java中是微不足道的,但我认为有一些关键缺失。

动机:

我希望能够使用所有基类方法

(new Pack()).contains(snoopy)

我希望能够直接或使用mixins扩展它

new Pack() with Driver

我希望能够简单地更改底层集合类型(以切换到Set为例)

谢谢!

1 个答案:

答案 0 :(得分:6)

List[T]是最终的,因此您无法从中扩展(请参阅下面的原因)。如果您只需要在List[Dog]上使用其他方法,最简单的方法就是对它进行操作:

implicit class Pack(l: List[Dog]) {
  def pullSled() = //...
}

如果Pack在范围内,则以下内容将起作用:

val a = List(new Dog)
a.pullSled()

如果你真的需要创建自己的狗系列,请看一下: http://www.scala-lang.org/docu/files/collections-api/collections-impl.html

由于以下因素,您无法从List[T]延伸:假设您拥有Pack,现在以下内容可以使用,但并不能真正满足您的需求:

val pack: Pack = ...

val pack2 = new Dog :: pack

// pack2: List[Dog], not a Pack... :(

正如上部链接中所述从LinearSeq正确延伸将缓解此问题。