鉴于
trait A[T]
class B[T] extends A[Option[T]]
在宏中,我可以看到A
是B
的超类型,B
是A
的子类型,但类型参数的具体情况如何匹配失踪了。
如何获取完整的extends A[Option[T]]
信息?
答案 0 :(得分:6)
我假设你想要这个信息给定的类型,而不是树(这是更容易,但不太一般)。诀窍是使用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]]
然后:
scala> whatever[A[_], B[_]]
Option[T]
通过删除whitebox
部分,可以轻松地将其调整为2.10。