我正在使用反射来获取参数类型的方法,但是varargs存在一些问题。这是我的代码:
import reflect.runtime.universe._
case class C() {
def f(x: String*) = x
}
object Main {
def main(args: Array[String]): Unit = {
val c = C()
val r = runtimeMirror(getClass.getClassLoader).reflect(c)
val x = r.symbol.typeSignature.member(newTermName("f"))
val params = x.asMethod.paramss.head.map {
_.typeSignature.typeSymbol
}
for (param <- params) {
println(param)
}
}
}
结果是:
> class <repeated>
如何获得真实类型String
?或者还有其他方法可以做到吗?
答案 0 :(得分:0)
使用_.typeSignature.typeArgs.head
,因为String
是String*
的类型参数,而不是typeSymbol
。
答案 1 :(得分:0)
您的参数x
的类型为String*
。这就是你所说的:
_.typeSignature.typeSymbol
但String*
被定义为Seq[String]
(我们都知道)。这样称呼:
_.typeSignature.typeArgs
会为您提供类型参数,即您想要的String
。
顺便说一句。如果您想证明String*
是Seq
,请致电:
_.typeSignature.erasure
所以修改后的代码应该是这样的(省略C类):
val c = C()
val r = runtimeMirror(getClass.getClassLoader).reflect(c)
val x = r.symbol.typeSignature.member(newTermName("f"))
val params = x.asMethod.paramss.head.map {
_.typeSignature.typeArgs
}
for (param <- params) {
println(param)
}
它会打印List(String)
。
享受