Owe*_*wen 4 macros scala scala-macros
特定
trait A[T]
class B[T] extends A[Option[T]]
Run Code Online (Sandbox Code Playgroud)
在宏中,我可以看到它A是超类型B并且B是子类型A,但缺少类型参数如何匹配的细节.
我怎样才能获得完整的extends A[Option[T]]信息?
我假设你想要这个信息给定类型,而不是树(这是更容易,但不太一般).诀窍是用来baseType获取A你的超类型的类型实例B,然后通过匹配来提取其类型参数TypeRef:
import scala.language.experimental.macros
import scala.reflect.macros.whitebox
def whateverImpl[X: c.WeakTypeTag, Y: c.WeakTypeTag](c: whitebox.Context) = {
import c.universe._
val xSymbol = weakTypeOf[X].typeSymbol
val ySymbol = weakTypeOf[Y].typeSymbol
ySymbol.typeSignature.baseType(xSymbol) match {
case TypeRef(_, _, List(arg)) => println(arg)
case _ => c.abort(c.enclosingPosition, "Types don't work.")
}
q"()"
}
def whatever[X, Y]: Unit = macro whateverImpl[X, Y]
trait A[T]
class B[T] extends A[Option[T]]
Run Code Online (Sandbox Code Playgroud)
然后:
scala> whatever[A[_], B[_]]
Option[T]
Run Code Online (Sandbox Code Playgroud)
通过移除whitebox零件,可以轻松地将其调整为2.10 .