Scala 定义宏以将案例类实例转换为映射并返回时的编译错误

Scala 定义宏以将案例类实例转换为映射并返回时的编译错误,scala,macros,Scala,Macros,我试图理解以下博文,其中讨论了如何使用宏来创建基于宏的通用方法,以将案例类对象与映射进行转换: 尽管我阅读了整篇文章和另一篇关于scala宏的文章,但我仍然不完全理解它们是如何工作的。不幸的是,我从博客文章中给出的示例代码中收到了几个编译错误,我不知道为什么会发生这些错误,也不知道如何解决它们。为了完整起见,我复制了下面的代码,前面是编译错误(我用有关编译错误的注释注释了代码片段)。有人知道为什么会出现这些编译器问题以及如何解决它们吗 -type mismatch; found : field.

我试图理解以下博文,其中讨论了如何使用宏来创建基于宏的通用方法,以将案例类对象与映射进行转换:

尽管我阅读了整篇文章和另一篇关于scala宏的文章,但我仍然不完全理解它们是如何工作的。不幸的是,我从博客文章中给出的示例代码中收到了几个编译错误,我不知道为什么会发生这些错误,也不知道如何解决它们。为了完整起见,我复制了下面的代码,前面是编译错误(我用有关编译错误的注释注释了代码片段)。有人知道为什么会出现这些编译器问题以及如何解决它们吗

-type mismatch; found : field.NameType required: 
     c.universe.TermName
-Can't unquote List[Nothing] with .., bottom type values often indicate programmer mistake
代码如下:

import scala.reflect.macros.Context
import scala.language.experimental.macros

trait Mappable[T] {
  def toMap(t: T): Map[String, Any]
  def fromMap(map: Map[String, Any]): T
}

object Mappable {
  implicit def materializeMappable[T]: Mappable[T] = macro materializeMappableImpl[T]

  def materializeMappableImpl[T: c.WeakTypeTag](c: Context): c.Expr[Mappable[T]] = {
    import c.universe._
    val tpe = weakTypeOf[T]
    val companion = tpe.typeSymbol.companionSymbol

    val fields = tpe.declarations.collectFirst {
      case m: MethodSymbol if m.isPrimaryConstructor ⇒ m
    }.get.paramss.head

    val (toMapParams, fromMapParams) = fields.map { field ⇒
      val name = field.name
      val decoded = name.decoded
      val returnType = tpe.declaration(name).typeSignature

      (q"$decoded → t.$name", q"map($decoded).asInstanceOf[$returnType]") // error 1
    }.unzip

    c.Expr[Mappable[T]] {
      q"""
      new Mappable[$tpe] {
        def toMap(t: $tpe): Map[String, Any] = Map(..$toMapParams)
        def fromMap(map: Map[String, Any]): $tpe = $companion(..$fromMapParams) // error 2
      }
    """
    }
  }
}

将t.$name更改为t.${name.toTermName}