0

我正在尝试T在宏实现中对 Java 类使用静态方法:

def macroImpl[T : c.WeakTypeTag](c: Context): c.Expr[ResultType] = {
  import c.universe._
  val tpe = weakTypeOf[T]
  val someStaticMethod = tpe.declaration(c.universe.newTermName("someStaticMethod")).asMethod
  c.Expr[ResultType] { q""" new ResultType {
    def myMethod = ${someStaticMethod.name.toTermName}  
  }"""}
}

这不起作用。当我打印出 的所有成员和声明时tpe,我想使用的静态方法不存在。如何访问这些静态方法并在准引用中使用它们?

我正在为 scala 2.10.6 使用 2.1.0 版的宏天堂编译器插件。

4

1 回答 1

0

在看到@som-snytt 的评论后,我研究了如何访问伴随对象。代码最终看起来像这样:

def macroImpl[T : c.WeakTypeTag](c: Context): c.Expr[ResultType] = {
  import c.universe._
  val tpe = weakTypeOf[T]
  val companion = tpe.typeSymbol.companionSymbol
  c.Expr[ResultType] { q""" new ResultType {
    def myMethod = ${companion.name.toTermName}.someStaticMethod  
  }"""}
}

我查找伴随符号,然后在准引号中调用someStaticMethod它的方法。这似乎做我想要的。

我可以companion通过做得到声明companion.typeSignature.declarations

于 2015-12-28T08:32:25.300 回答