2

我想做类似的事情

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)

谢谢!

4

1 回答 1

6

List[T]是最终的,因此您不能从它扩展(请参阅下面的原因)。如果您只需要在 a 上使用其他方法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如上链接中所述正确扩展将减轻这种情况。

于 2013-04-30T00:11:14.977 回答