我想做点什么
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为例)
谢谢!
答案 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
正确延伸将缓解此问题。