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

扩展特定成员类型的scala集合,scala,scala-collections,scala-2.10,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) 我希望能够直接或通过mixin扩展它 new Pack

我想做一些像

class Pack extends collection.immutable.List[Dog]{
  def pullSled() = //...
}
但是Scala编译器告诉我

illegal inheritance from sealed class List
在Java中这样做很简单,但我认为我缺少了一些关键的东西

动机:

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

(new Pack()).contains(snoopy)
我希望能够直接或通过mixin扩展它

new Pack() with Driver
我希望能够简单地更改基础集合类型(例如切换到集合)


谢谢

列表[T]
是最终的,因此您不能从中进行扩展(请参见下面的原因)。如果您只需要在
列表[Dog]
上添加一种方法,最简单的方法可能是拉皮条:

implicit class Pack(l: List[Dog]) {
  def pullSled() = //...
}
如果
Pack
在范围内,则以下操作将起作用:

val a = List(new Dog)
a.pullSled()
如果您真的需要创建自己的狗狗收藏,请查看以下内容:

由于以下原因,您无法从
List[T]
扩展:假设您有
Pack
作为您想要的内容,现在以下内容将起作用,但并不能真正满足您的需要:

val pack: Pack = ...

val pack2 = new Dog :: pack

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

如上面链接中所述,从
LinearSeq
正确扩展将缓解这一问题。

回答得好!我这样做的部分动机是可读性。我仍然想要集合中所有有用的方法,但仍然能够传递简单的未序列化对象。在现实生活中,我想为比狗更麻烦的课程做这件事。再次感谢@用户833970很高兴它有帮助。顺便说一句,简单类型别名也可能是一个选项。ailiasing的问题是我以后仍然无法扩展我的专用类。当然,那只是为了减少名称混乱。顺便说一句,第四种选择是只使用合成和代理您需要的内容,可能会隐式转换为提取内部容器的
List[Dog]