コードの一部を 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]
}
}
「エラーまたはアクセスできない型」というコンパイラ エラーが発生します。
どうしたの?誰かが回避策を提案できますか?