我只是将我的一些代码更新到2.9.0,而且我遇到了一个问题。我有一个特性,我称之为“NonStrictIterable”(基本上,一切都应该尽可能地懒惰 - NonStrictIterable本身之外的代码不应该运行,直到某人实际要求一个元素)。
在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]
}
}
我得到编译器错误“错误或无法访问的类型”。
发生了什么事?有人可以提出解决方法吗?
答案 0 :(得分:8)
你需要升级到2.9最终版。这是以前修正的RC中的一个错误。
答案 1 :(得分:1)
适合我。我怀疑你实际上正在编译来自RC3的scala-library.jar。
~/code/scalaz[scala-2.9.x*]: scala29
Welcome to Scala version 2.9.0.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import scala.collection.GenTraversableOnce
import scala.collection.GenTraversableOnce
scala> import scala.collection.generic.CanBuildFrom
import scala.collection.generic.CanBuildFrom
scala>
scala> 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]
| }
| }
defined trait NonStrictIterable