我可以通过检查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]
类型参数?
答案 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)