如何通过反射获取在Scala中在运行时找到的成员类型的* declared * generic参数?

时间:2014-04-02 05:48:36

标签: scala reflection

这与Finding type parameters via reflection in Scala 2.10?有关,但那里给出的解决方案对我不起作用。我想要做的是迭代一个类的成员,其中一些是列表等,例如val myField:List [String]。我希望能够以某种方式从那里得到“String”而不必破解typeSignature字段的.toString值。

我试过

typeOf[member.typeSignature].asInstanceOf[TypeRefApi].args

但显然typeSignature返回的scala.runtime.Type实现与typeOf返回的实现不同(在上面的问题中使用),因为我得到以下异常:

java.lang.ClassCastException: scala.reflect.internal.Types$NullaryMethodType cannot be cast to scala.reflect.api.Types$TypeRefApi

我也尝试过:

val TypeRef(_, _, tpe :: Nil) = member.typeSignature

但后来我得到了这个例外:

scala.MatchError: => scala.Option[String] (of class scala.reflect.internal.Types$NullaryMethodType)

有谁知道怎么做?

1 个答案:

答案 0 :(得分:0)

更新:我找到了一种方法:

val NullaryMethodType(tpe) = member.typeSignature
val TypeRef(_, _, tpe2 :: Nil) = tpe

然后tpe2将具有正确的值。现在,这会在非通用输入上崩溃,但我可以解决这个问题。