Kompilieren Sie Fehler beim Definieren eines Makros zum Konvertieren einer Instanz einer Fallklasse in eine Map und zurück

Ich versuche, den folgenden Blog-Beitrag zu verstehen, in dem erläutert wird, wie mithilfe von Makros ein generischer makrobasierter Ansatz zum Konvertieren von Fallklassenobjekten in und aus einer Karte erstellt wird:http://blog.echo.sh/post/65955606729/exploring-scala-macros-map-to-case-class-conversion

Obwohl ich den gesamten Beitrag und einen anderen Artikel über Scala-Makros gelesen habe, verstehe ich immer noch nicht ganz, wie sie funktionieren. Leider erhalte ich eine Reihe von Kompilierungsfehlern aus dem im Blogbeitrag angegebenen Beispielcode und bin nicht sicher, warum die Fehler auftreten und wie sie behoben werden können. Der Vollständigkeit halber reproduziere ich den folgenden Code, dem die Kompilierungsfehler vorangestellt sind (ich habe den Codeausschnitt mit Kommentaren zu den Kompilierungsfehlern versehen). Weiß jemand, warum diese Compilerprobleme auftreten und wie man sie behebt?

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

Hier ist der Code:

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
      }
    """
    }
  }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage