从Seq [T]中提取类型T

Ign*_*rre 3 scala scala-reflect

我有一个案例类,其中有两个字段Seq[Objects]。这两个对象属于两个不同的案例类。

  case class Passport(country: String, name: String)
  case class DrivingLicence(code: String, name: String)
  case class Docs(passports : Seq[Passport], driv: Seq[DrivingLicence])

  val pass1 = Passport("UK", "Michael")
  val pass2 = Passport("USA", "Michael")

  val driv1 = DrivingLicence("A2", "Mich")
  val driv2 = DrivingLicence("A4", "Mich")

  val docs = Docs(Seq(pass1,pass2), Seq(driv1,driv2))
Run Code Online (Sandbox Code Playgroud)

我可以生成具有所有属性及其类型的地图,如下所示:

  val r = currentMirror.reflect(docs)
  val mapType = r.symbol.typeSignature.members.toStream
    .collect{case s : TermSymbol if !s.isMethod => r.reflectField(s)}
    .map(r => r.symbol.name.toString.trim -> r.symbol.typeSignature)
    .toMap
println("Map of Types: "+mapType)
Run Code Online (Sandbox Code Playgroud)

输出为:

地图类型:地图(driv-> Seq [DrivingLicence],护照-> Seq [Passport])

但是我想要的是摆脱Seq部分,并获得内部类型。就像是:

类型地图:地图(驾驶->驾驶执照,护照->护照)

如何访问a的内部类型Seq[_]

Krz*_*sik 5

您可以使用来获取类型实参的列表typeArgs,但它将返回List[Type],因此您需要使用来获取第一个元素head

r.symbol.typeSignature.typeArgs.head
Run Code Online (Sandbox Code Playgroud)