如何在不定义实现的情况下在Scala中定义自定义集合接口?
我正在尝试在
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的实现者需要提供具有构建器实现和隐式CanBuildFrom对象(可以简单地为GenericCanBuildFroms)的伴随对象. 编辑: 需要上面提到的GenericTraversablTemplate,因为它首先确保集合将具有GenericCanBuildFrom构建器工厂调用的genericBuilder方法.其次,它确保集合实际上具有GenericCompanion类型的伴随对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |