クラスパスに基づいて、リフレクションで Avro4s の RecordFormat を生成しようとしています。次のコードはエラーをスローします。
case class MyCaseClass(a: Int)
println(toolBox.compile {
toolBox.parse(
s"""
|import com.sksamuel.avro4s._
|import mypackage.MyCaseClass
|RecordFormat[MyCaseClass]
|""".stripMargin
)
}())
タイプ com.sksamuel.avro4s.Decoder[mypackage.MyCaseClass] の証拠パラメーターの暗黙的な値が見つかりませんでした
RecordFormatは似ています
object RecordFormat {
def apply[T <: Product : Encoder : Decoder : SchemaFor]: RecordFormat[T] = apply(AvroSchema[T])
def apply[T <: Product : Encoder : Decoder](schema: Schema): RecordFormat[T] = new RecordFormat[T] {
private val fromRecord = FromRecord[T](schema)
private val toRecord = ToRecord[T](schema)
override def from(record: GenericRecord): T = fromRecord.from(record)
override def to(t: T): Record = toRecord.to(t)
}
}
わかりました。解決できますが、 でEncoder[MyCaseClass]
失敗SchemaFor[MyCaseClass]
しDecoder[MyCaseClass]
ます。
同じコードはRecordFormat[MyCaseClass]
リフレクションなしで解決できます。
Decoder
に似たマクロで実装されていることがわかりますEncoder
。
implicit def applyMacro[T <: Product]: Decoder[T] = macro applyMacroImpl[T]
リフレクションでは暗黙の証拠を解決できないのはなぜですか?