我只是将我的一些代码更新到2.9.0,并且遇到了问题。我有一个特性,我称之为“NonStrictIterable”(本质上,一切都应该尽可能的懒惰 - 除非有人真正要求元素,否则NonStrictIterable本身之外的任何代码都不应该运行)。如何在Scala 2.9.0中重写Iterable.flatMap?
在2.9.0中,我似乎无法重写flatMap,但是。这里有一个减少版,表现出了错误:
import scala.collection.generic.CanBuildFrom
trait NonStrictIterable[A] extends Iterable[A] { self =>
def iterator: Iterator[A]
override def flatMap[B, That](f: A => TraversableOnce[B])(implicit bf: CanBuildFrom[Iterable[A], B, That]): That = {
new NonStrictIterable[B] {
def iterator = self.iterator flatMap { a: A => f(a).toIterable.iterator }
}.asInstanceOf[That]
}
}
这用来工作前2.9.0,但现在我得到“方法flatMap覆盖一无所有”。查找Iterable.flatMap的方法签名,我发现类型签名中的TraversableOnce
已更改为enTraversableOnce
。进行相应的更改
import scala.collection.GenTraversableOnce
import scala.collection.generic.CanBuildFrom
trait NonStrictIterable[A] extends Iterable[A] { self =>
def iterator: Iterator[A]
override def flatMap[B, That](f: A => GenTraversableOnce[B])(implicit bf: CanBuildFrom[Iterable[A], B, That]): That = {
new NonStrictIterable[B] {
def iterator = self.iterator flatMap { a: A => f(a).toIterable.iterator }
}.asInstanceOf[That]
}
}
我得到编译器错误“错误或无法访问的类型”。
What's going on? Can someone suggest a workaround?
哦,亲爱的!今天我在Eclipse中使用了2.9.0.RC3,而在sbt中使用了2.9.0.final。很混乱。谢谢您的帮助。 – 2011-05-12 23:53:52