加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在不定义实现的情况下在Scala中定义自定义集合接口?

发布时间:2020-12-16 18:15:09 所属栏目:安全 来源:网络整理
导读:我正在尝试在 Scala 2.8中定义自定义集合接口.我想要求子类是Traversable,还有其他一些行为.我也想像map()这样的方法返回相应的类型,如下所示: trait CustomCollection[+A] extends Traversable[A] { def customOperation(i:Int):Int // for example}def in
我正在尝试在 Scala 2.8中定义自定义集合接口.我想要求子类是Traversable,还有其他一些行为.我也想像map()这样的方法返回相应的类型,如下所示:

trait CustomCollection[+A] extends Traversable[A] {
    def customOperation(i:Int):Int // for example
}

def incrementAll(c:CustomCollection[Int]):CustomCollection[Int] = c.map { _ + 1 }

这不会编译,因为CustomCollection.map()返回Traversable.我想我需要定义一个CanBuildFrom,但是我需要定义一个从头构建实例的apply()方法.我不想指定一种方法来构建它;这应该取决于实施者.这可能吗?

解决方法

如果希望map返回更具体的集合类型,则还应继承TraversableLike,并将第二个类型参数(表示类型)设置为CustomCollection [A].

接下来,map需要一个CanBuildFrom类型的隐式参数.它将查看CustomCollection的伴随对象,以查找该类型的符合隐式值.如果你看一下Seq类的源代码,你会看到他们的同伴提供了GenericCanBuildFrom类型的CanBuildFrom对象,它将构建器的调用转发回请求构建器的集合.这样,Seq变换器方法的返回类型的动态类型(例如map)总是与序列本身的类型相同.

你要做的是:

>使CustomCollection [A]继承TraversableLike
>使CustomCollection [A]继承GenericTraversableTemplate
>创建CustomCollection的伴随对象并添加一个返回GenericCanBuildFrom的隐式对象
>在CustomCollection协同服务器中为构建器提供默认实现

CustomCollection的实现者需要提供具有构建器实现和隐式CanBuildFrom对象(可以简单地为GenericCanBuildFroms)的伴随对象.

编辑:

需要上面提到的GenericTraversablTemplate,因为它首先确保集合将具有GenericCanBuildFrom构建器工厂调用的genericBuilder方法.其次,它确保集合实际上具有GenericCompanion类型的伴随对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读