【问题标题】:extending scala collections for a specific member type为特定成员类型扩展 scala 集合
【发布时间】:2013-04-23 19:08:37
【问题描述】:

我想做类似的事情

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)

谢谢!

【问题讨论】:

    标签: scala scala-collections scala-2.10


    【解决方案1】:

    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 正确扩展将缓解此问题。

    【讨论】:

    • 好答案!我这样做的部分动机是可读性。我仍然想要一个集合的所有有用方法,但仍然能够传递简单的未参数化对象。在现实生活中,我想为比狗更繁琐的课程做这个。再次感谢!
    • @user833970 很高兴它有帮助。顺便说一下,一个简单的类型别名也可能是一种选择。
    • 别名的问题是我以后仍然无法扩展我的专业类。
    • 当然,这只是为了减少名称混乱。顺便提一句。第四种选择是只使用合成和代理你需要的东西,也许隐式转换为List[Dog] 以提取内部容器。
    猜你喜欢
    • 2015-04-10
    • 2014-11-15
    • 2011-05-17
    • 1970-01-01
    • 2013-08-25
    • 2016-07-08
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多