假设我有一个宏实现
def testImpl[T](c:Context)(implicit wtt:c.WeakTypeTag[T]):c.Tree = {
import c.universe._
def info(msg: Any) = c.info(c.enclosingPosition, msg.toString, true)
val parameter = wtt.tpe.member(TermName("f")).paramLists(0)(0)
info(parameter.typeSignature)
q"{}"
}
宏定义
def test[T]:Unit = macro DerivingImpl.testImpl[T]
此宏在其类型参数中查找函数f
,并打印有关其第一个参数类型的信息。
现在如果我像这样使用这个宏
trait Trait[A] {
def f(x:A): Int
}
test[Trait[Int]]
我打印A
。我想得到Int
。我理解调用member
会返回方法符号,该符号没有关于具体应用类型的信息。那么,找到参数的实际类型的正确方法是什么?
谢谢。
答案 0 :(得分:5)
val f = wtt.tpe.member(TermName("f"))
val MethodType(parameter :: Nil, _) = f.typeSignatureIn(wtt.tpe)
info(parameter.typeSignature)