暗黙的にメソッドを使用する
最も一般的で一般的なアプローチは、Predefで定義されている暗黙的なメソッドを使用することです。
def add[T: Numeric](x: T, y: T) = implicitly[Numeric[T]].plus(x,y)
明らかに、これはやや冗長であり、型クラスの名前を繰り返す必要があります。
証拠パラメータを参照する(しないでください!)
もう1つの方法は、コンパイラーによって自動的に生成された暗黙の証拠パラメーターの名前を使用することです。
def add[T: Numeric](x: T, y: T) = evidence$1.plus(x,y)
この手法が合法であるのは驚くべきことであり、証拠パラメータの名前が変更される可能性があるため、実際には信頼すべきではありません。
より高い種類のコンテキスト(メソッドの紹介context
)
代わりに、implicitly
メソッドの強化バージョンを使用できます。暗黙的にメソッドが次のように定義されていることに注意してください
def implicitly[T](implicit e: T): T = e
このメソッドは、コンパイラーに依存して、周囲のスコープからメソッド呼び出しに正しい型の暗黙のオブジェクトを挿入し、それを返します。もう少しうまくやることができます:
def context[C[_], T](implicit e: C[T]) = e
add
これにより、メソッドを次のように定義できます。
def add[T: Numeric](x: T, y: T) = context.plus(x,y)
context
メソッドタイプパラメータNumeric
とはT
スコープから推測されます!残念ながら、このcontext
方法が機能しない状況があります。たとえば、型パラメーターに複数のコンテキスト境界がある場合、または異なるコンテキスト境界を持つ複数のパラメーターがある場合。後者の問題は、もう少し複雑なバージョンで解決できます。
class Context[T] { def apply[C[_]]()(implicit e: C[T]) = e }
def context[T] = new Context[T]
このバージョンでは、毎回タイプパラメータを指定する必要がありますが、複数のタイプパラメータを処理します。
def add[T: Numeric](x: T, y: T) = context[T]().plus(x,y)