加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读