相关疑难解决方法(0)

scala 2.10.2调用泛型类型的"宏方法"不起作用

我定义了以下宏来将case字段转换为map

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

    def asMap_impl[T: c.WeakTypeTag](c: Context)(t: c.Expr[T]) = {
      import c.universe._

      val mapApply = Select(reify(Map).tree, newTermName("apply"))

      val pairs = weakTypeOf[T].declarations.collect {
        case m: MethodSymbol if m.isCaseAccessor =>
          val name = c.literal(m.name.decoded)
          val value = c.Expr(Select(t.tree, m.name))
          reify(name.splice -> value.splice).tree
      }

      c.Expr[Map[String, Any]](Apply(mapApply, pairs.toList))
    }
Run Code Online (Sandbox Code Playgroud)

并且方法实现

def asMap[T](t: T) = macro asMap_impl[T]
Run Code Online (Sandbox Code Playgroud)

然后我定义一个案例类来测试它

case class User(name : String)
Run Code Online (Sandbox Code Playgroud)

它工作正常(使用scala repl):

 scala> asMap(User("foo")) res0:
 scala.collection.immutable.Map[String,String] = Map(name -> foo)
Run Code Online (Sandbox Code Playgroud)

但是当我用另一个泛型方法包装此方法时

def printlnMap[T](t: T) = println(asMap(t))
Run Code Online (Sandbox Code Playgroud)

此方法始终打印空地图:

scala> printlnMap(User("foo"))
Map() …
Run Code Online (Sandbox Code Playgroud)

generics scala scala-macros

10
推荐指数
1
解决办法
1347
查看次数

标签 统计

generics ×1

scala ×1

scala-macros ×1