TraversableLikeではなくGenericTraversableTemplateでflattenが宣言されているのはなぜですか?
-
05-07-2019 - |
質問
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
であるという意味でのみimplicit
と異なるように思えます)TraversableLike
で次のように定義できません:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
これが事実でなければならない理由はありますか?
解決
答えはソースコードにあると思います:
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]
flatten
への暗黙的なパラメーターは、実際にはA <:< Traversable[B]
である必要があります(つまり、GenericTraversableTemplate
の汎用パラメーター自体がTraversable
であるという主張)。 (このメーリングリストスレッドを参照してください現在コメントアウトされている理由についての議論。)私の理解では、この特性のすべてのメソッドはコレクションクラスのコンパニオンオブジェクト(の一部)で定義されていました。型パラメータの正しい単語)。この<:<
構造により、インスタンスメソッドにすることができます。
所属していません StackOverflow