Извлечь тип T из Seq [T] - PullRequest
3 голосов
/ 01 июля 2019

У меня есть класс case, в котором есть два поля: 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))

Я могу сгенерировать карту со всеми атрибутами и их типами, как показано ниже:

  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)

И вывод:

Карта типов: Карта (driv -> Seq [DrivingLicence], паспорта -> Seq [Passport])

Но я бы хотел избавиться от Seqчасть, и получить внутренний тип.Что-то вроде:

Карта типов: Карта (driv -> DrivingLicence, паспорта -> Паспорт)

Как я могу получить доступ к внутреннему типу Seq[_]?

1 Ответ

5 голосов
/ 01 июля 2019

Вы можете получить список аргументов типа с помощью typeArgs, но он вернет List[Type], поэтому вам нужно будет взять первый элемент с head:

r.symbol.typeSignature.typeArgs.head
...