从Type中检索继承特征的类型参数信息

时间:2016-08-18 20:39:53

标签: scala types type-inference

我可以通过检查PartialFunction成员轻松提取typeArgs类型的类型信息:

scala> typeOf[PartialFunction[String,Int]].typeArgs
res168: List[reflect.runtime.universe.Type] = List(String, Int)

但是,如果我将PartialFunction与其他特征结合起来,我似乎失去了检索PartialFunction特征的类型参数的能力:

scala> val t = typeOf[Iterable[Any] with PartialFunction[String,Int]]
t: reflect.runtime.universe.Type = scala.Iterable[Any] with scala.PartialFunction[String,Int]

scala> t.typeArgs
res170: List[reflect.runtime.universe.Type] = List()

t似乎保留了List(String, Int)信息,因为它保留了with PartialFunction[String,Int]的信息,但我再也看不到提取该类型信息的方法了。

如何检索PartialFunction类型的SomeTrait with PartialFunction[String,Int]类型参数?

1 个答案:

答案 0 :(得分:2)

解决方案

t.baseType(typeOf[PartialFunction[_,_]].typeSymbol).typeArgs

解释

您可以通过baseClasses成员检查继承链中的基类:

scala> t.baseClasses
res181: List[reflect.runtime.universe.Symbol] =
  List(<refinement of scala.Iterable[Any] with String => Int>,
  trait PartialFunction,
  ...)

您可以从那里检索代表Symbol的{​​{1}},并使用它通过baseType method获取PartialFunction PartialFunction个实例。

t

现在您可以按照正常情况检查scala> val pf = t.baseType(t.baseClasses(1)) pf: reflect.runtime.universe.Type = PartialFunction[String,Int] 的类型参数:

PartialFunction

如果您知道要访问的特征类型,那么专门引用它会更安全,而不是从基类集合中提取它:

scala> pf.typeArgs
res192: List[reflect.runtime.universe.Type] = List(String, Int)