我正在尝试根据类路径在反射中生成 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]
为什么反思不能解决隐含的证据?