Ich versuche, einen generischen impliziten Anbieter zu machen, die einen impliziten Wert für einen bestimmten Typen, etwas in den Zeilen erstellen:Importieren generic implicits von Klasseninstanzen
trait Evidence[T]
class ImplicitProvider[T] {
class Implementation extends Evidence[T]
implicit val evidence: Evidence[T] = new Implementation
}
diese impliziten zu verwenden, ich erstellen eine val provider = new ImplicitProvider[T]
Instanz wo notwendig und importieren Sie daraus import provider._
. Dies funktioniert, solange es nur eine Instanz gibt. Doch manchmal implicits für verschiedene Arten an einem Ort benötigt
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]]
}
Und dies nicht gelingt mit could not find implicit value for parameter
und not enough arguments for method implicitly
Fehler zu kompilieren.
Wenn ich implizite Vals von Providern direkt verwende, fängt alles wieder an zu arbeiten.
implicit val aEvidence = aProvider.evidence
implicit val bEvidence = bProvider.evidence
Jedoch versuche ich einzelne Werte zu vermeiden, importieren, da es tatsächlich mehrere implicits in jedem Provider ist und das Ziel ist es, sie wenn möglich zu abstrahieren.
Kann dies irgendwie erreicht werden oder will ich zu viel vom Compiler?
Aus irgendeinem Grund habe ich immer implicits Auflösung von Typ nur gedacht, gearbeitet, keine Namen zu berücksichtigen. Der eigentliche Zweck von 'ImplicitProvider' ist in meinem Fall die Bereitstellung von Circe' Encoder'/'Decoder' Instanzen für bestimmte Arten von Objekten. Diese Typen sind vorher nicht bekannt, daher können Sie in einem Objekt keine vorgefertigten Instanzen haben. Ich habe versucht, einen Mindeststandard für den Benutzer zu erreichen, ohne die einzelnen 'Encoder' /' Decoder' importieren oder referenzieren zu müssen. Danke für die implizite Konvertierung Tipp, es war das fehlende Glied. Es hat genau das getan, was gebraucht wurde. –