在scala宏中,如何获取类的完整`extends`子句?
发布时间:2020-12-16 18:12:48 所属栏目:安全 来源:网络整理
导读:特定 trait A[T]class B[T] extends A[Option[T]] 在宏中,我可以看到A是B的超类型,B是A的子类型,但缺少类型参数匹配的具体细节. 如何获得完整的扩展A [Option [T]]信息? 解决方法 我假设你想要这个信息给定类型,而不是树(这是更容易,但不太一般).诀窍是使用
特定
trait A[T] class B[T] extends A[Option[T]] 在宏中,我可以看到A是B的超类型,B是A的子类型,但缺少类型参数匹配的具体细节. 如何获得完整的扩展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] 通过移除白盒部件,可以轻松地将其调整为2.10. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |