给定的
trait A[T]
class B[T] extends A[Option[T]]
在宏中,我可以看到
A
是 B
的父类(super class)型和 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]]
进而:
scala> whatever[A[_], B[_]]
Option[T]
这可以通过删除
whitebox
轻松适应 2.10部分。
关于scala - 在 Scala 宏中,如何获取类的完整 `extends` 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374041/