2

我只是将我的一些代码更新到 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]
  }
}

我收到编译器错误“错误或无法访问的类型”。

这是怎么回事?有人可以提出解决方法吗?

4

2 回答 2

8

您需要升级到 2.9 最终版。这是先前 RC 中的错误,已修复。

于 2011-05-12T21:15:02.040 回答
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
于 2011-05-12T21:15:03.417 回答