を一般的な暗黙のインポート:私が作成し、私は、指定された型の暗黙の値を作成することができ、一般的な暗黙のプロバイダを作るためのラインで何かしようとしているクラスのインスタンスから
trait Evidence[T]
class ImplicitProvider[T] {
class Implementation extends Evidence[T]
implicit val evidence: Evidence[T] = new Implementation
}
この暗黙的に使用するには必要に応じてval provider = new ImplicitProvider[T]
インスタンスをインポートし、import provider._
からインポートします。インスタンスが1つしかない限り、これは正常に動作します。しかし、時にはいくつかのタイプのための暗黙のは、一つの場所
case class A()
case class B()
class Test extends App {
val aProvider = new ImplicitProvider[A]
val bProvider = new ImplicitProvider[B]
import aProvider._
import bProvider._
val a = implicitly[Evidence[A]]
val b = implicitly[Evidence[B]]
}
に必要そして、これはとnot enough arguments for method implicitly
エラーでコンパイルに失敗しています。
プロバイダからの暗黙的な値を直接使用すると、すべてが再び機能し始めます。そこに各プロバイダ内の実際にいくつかの暗黙があり、可能であれば目標が抽象的にそれらであるよう
implicit val aEvidence = aProvider.evidence
implicit val bEvidence = bProvider.evidence
は、しかし、私は、個々の値をインポートしないようにしようとしています。
これは何とか実現できますか、あまりにもコンパイラから欲しいですか? aProvider
でevidence
とbProvider
でevidence
:
を。 私の場合の 'ImplicitProvider'の実際の目的は、特定のタイプのオブジェクトに対してCirce' Encoder'/'Decoder'インスタンスを提供することです。これらの型はあらかじめわかっていないので、オブジェクトに既成のインスタンスを持つことはできません。私は、個々の 'Encoder' /' Decoder'をインポートしたり参照したりする必要なしに、ユーザのための最小定型化を達成しようとしていました。 暗黙の変換のヒントのおかげで、リンクが見つかりませんでした。それはちょうど必要なことをした。 –