我有以下类定义:
class Foo[T](iteratorThunk: () => Iterator[T]) {
def values = iteratorThunk()
}
我希望Foo
拥有Iterator
公开的所有方法,同时仍然返回Foo
类型的对象。例如,我希望能够做到:
val a = new Foo({ () => List(1, 2, 3).toIterator })
val b = new Foo({ () => List(4, 5, 6).toIterator })
val c = a ++ b
让c
等于:
new Foo({ () => a.values ++ b.values })
我查看了转发器(IterableForwarder
,TraversableForwarder
,...),但似乎没有一个方法可以将方法转发给Iterator
,我仍然想保留{ {1}}作为静态和动态结果类型。
在没有定义每种转发方法的情况下,实现此行为的最佳方法是什么?
答案 0 :(得分:1)
我需要Foo类,而不仅仅是Iterator,因为我 需要能够通过其值进行多次传递。
然后您需要Traverable
或Iterable
。要让它们按照您的意愿工作,您需要扩展它们TraversableLike
或IterableLike
,您将通过它们指定返回类型。而且您还需要同时提供Builder
和CanBuildFrom
。
这是一个简单的实现:
import scala.collection.IterableLike
import scala.collection.mutable.LazyBuilder
class Foo[T](iteratorThunk: () => Iterator[T]) extends Iterable[T] with IterableLike[T, Foo[T]] {
def iterator = iteratorThunk()
override protected def newBuilder = new Foo.FooBuilder[T]
}
object Foo {
class FooBuilder[T] extends LazyBuilder[T, Foo[T]] {
def result(): Foo[T] = {
val coll = parts.toList.flatten
new Foo(() => coll.iterator)
}
}
}