Я просто обновляю часть своего кода до 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]
}
}
Я получаю ошибку компилятора "ошибочный или недоступный тип".
Что происходит? Может кто-нибудь предложить обходной путь?