0

クラスパスに基づいて、リフレクションで 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)
  }
}

参照: https://github.com/sksamuel/avro4s/blob/release/2.0.x/avro4s-core/src/main/scala/com/sksamuel/avro4s/RecordFormat.scala

わかりました。解決できますが、 でEncoder[MyCaseClass]失敗SchemaFor[MyCaseClass]Decoder[MyCaseClass]ます。

同じコードはRecordFormat[MyCaseClass]リフレクションなしで解決できます。

Decoderに似たマクロで実装されていることがわかりますEncoder

implicit def applyMacro[T <: Product]: Decoder[T] = macro applyMacroImpl[T]

リフレクションでは暗黙の証拠を解決できないのはなぜですか?

4

1 に答える 1