私は、ビューバウンドと同等のものは何であるかを自問しています
(implicit conv: String => A)
A
私の最初の試みは、次のように型パラメーターを単純に宣言することでした。
[String <% A]
しかし、Scala コンパイラは"not found: type A"と文句を言います。
助言がありますか?
私は、ビューバウンドと同等のものは何であるかを自問しています
(implicit conv: String => A)
A
私の最初の試みは、次のように型パラメーターを単純に宣言することでした。
[String <% A]
しかし、Scala コンパイラは"not found: type A"と文句を言います。
助言がありますか?
--修正後の投稿--
この構文[B <% A]
は、実際には新しい型をバインドしますB
。そう
class Foo[A, String <% A]
と同等です
class Foo[A, String](implicit $conv: String => A)
whereString
は、考えているクラスではなく、任意の型パラメーターです。
名前付きの暗黙的な変換がおそらく最良の選択肢だと思いますが、
class Foo[A](implicit conv: String => A)
の型はString
シャドウされていません。
概要: ビュー境界は、型パラメーターへの変換ではなく、導入された型パラメーターからの変換として役立ちます。
それはビューバウンドではありません。バインドされたビューは、型パラメーターA
が type として表示 (変換) できるという点でバインドされていることを示しますB
。型と型パラメーターを逆にしたものは、修飾されません。
より明確にするために、境界は「自由な」型 (型パラメーター) に対する制限です。例えば:
type A <: String // A has an upper bound
type A >: String // A has a lower bound
したがって、ビューバウンドも制限であり、非常に異なるメカニズムによって課せられます。そのため、型ではなく、型パラメーターにのみ課すことができます。
確かに、String => A
存在しなければならないということも一種の束縛ですが、名前や構文糖衣があるものではありません。