我正在用Scala编写一些宏。
让我们假设我有一些Type
,例如typeOf[Map[String,Set[Int]]]
和一个类似的类型,其中它的一些部分已被不确定的类型参数替换,例如typeOf[Map[String,Set[T]]]
,其中T
未知。
如何将这两种类型相互匹配,才能发现T
是Int
?
typeArgs
属性返回类型参数列表。如果我正确理解你需要什么:
val mapParams = typeOf[Map[String, Set[Int]]].typeArgs // List(String, Set[Int])
val setType = mapParams.drop(1).head // Set[Int]
val setParam = setType.typeArgs.head // Int
您可以尝试使用准引号文档:http://docs.scala-lang.org/overviews/quasiquotes/syntax-summary.html
import scala.reflect.runtime.universe._
tq"Map[Int,Int]" match {
case tq"Map[Int,$t2]" => t2
}
tq"Map[Int,Seq[Int]]" match {
case tq"Map[Int,Seq[$t2]]" => t2
}