2

の署名TraversableLike.flatMapは次のとおりです。

def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th

の署名GenericTraversableTemplate.flattenは次のとおりです。

def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B] 

後者の方法(変換flatMap関数implicitTraversableLike

def flatten[B, Th](implicit asTraversable: (A) => Traversable[B], 
                   implicit bf : CanBuildFrom[Repr, B, Th]) : Th

そうでなければならない何らかの理由がありますか?

4

1 に答える 1

2

答えはソースコードにあると思います。

def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]

の暗黙のパラメータflattenは実際にはである必要がありますA <:< Traversable[B](つまり、の汎用パラメータGenericTraversableTemplate自体がであるというアサーションTraversable)。(現在コメントアウトされている理由については、このメーリングリストスレッドを参照してください。)私の理解では、このトレイトのすべてのメソッドは、一部のインスタンス化にのみ適用可能であったため、コレクションクラスのコンパニオンオブジェクト(の一部)で定義されていました(それが正しい単語である場合)タイプパラメータ。この<:<構成により、それらをインスタンスメソッドにすることができます。

于 2010-04-11T20:21:44.223 に答える