検討したいいくつかの選択肢を次に示します。
1.ビューバウンドを使用する
Bのリストを取得する関数を変更できる場合、これが最も簡単な解決策になります。Bに変換できるもののリストを受け入れるように変更します。あれは、
def yourFn(l: List[B]) = ...
になります
def yourFn[X <% B](l: List[X]) = ...
次に、listOfAを使用して関数を呼び出すことができます。
yourFn(listOfA)
2.変換方法を紹介します
これは、外部変換が暗黙的でないことを除いて、Rogachの最初のソリューションに似ています。
def convert[B, A <% B](l: List[A]): List[B] = l map { a => a: B }
次に、関数の呼び出しサイトで、次のように記述します。
yourFn(convert(listOfA))
Rogachの2番目のソリューションと同様に、これは暗黙的な変換を行うよりも少し安全です。
3.暗黙の変換を導入します
これはRogachの最初のソリューションと同等ですが、表記は少し優れています(IMO)。
implicit def convert[B, A <% B](l: List[A]): List[B] = l map { a => a: B }
この変換が呼び出しサイトの範囲内にある場合は、listOfAを使用して関数を呼び出すことができます。
yourFn(listOfA)
別れの考え
この問題を一般的な方法で解決する方法を検討するのは興味深いことです。メソッドを実装する任意の型を処理できるように変換メソッドを定義したい場合はどうなりますmap
か?すなわち、
def convert[B, A <% B, C[_]](c: C[A]): C[B] = c map { a => a: B }
もちろん、これは機能しません。署名には、C
実装する必要のある制約を表すものがないためmap
です。私の知る限り、この制約の表現はかなり複雑であり、を実装するすべてのタイプにすぐに使用できるサポートを提供する方法で行うことはできませんmap
。タイプセーフなScalaシーケンス内包表記を参照してください。