在Scala中将一个对象转换为类似的附加字段

时间:2017-10-20 16:01:23

标签: scala playframework type-conversion

所以我有一个案例类,内部使用的案例类和另一个用于外部API的案例类。我正试图从一个转换到另一个。 当然,我可以手工编写每个参数并将其解决,但这很烦人,我每次添加或删除字段时都必须更新此代码。 我想要做到这一点:

import shapeless.syntax.std.tuple._

trait STrait {
  def id: Option[Int] = None
  def addressId: Option[Int] = None
  def name: String
  def about: Option[String] = None
  def numberOfStudents: Option[Int] = None
  def websiteUrl: Option[String] = None
  def mediaId: Option[Int] = None
  def slug: String
  def shortDescription: Option[String] = None
  def ready: Boolean
  def classrooms: Option[Int] = None
  def yearEstablished: Option[String] = None
  def displayCopyright: Boolean
  def createdAt: DateTime = DateTime.now
  def updatedAt: DateTime = DateTime.now
  def deletedAt: Option[DateTime] = None
  def createdBy: Option[String] = None
  def updatedBy: Option[String] = None
  def dliNumber: Option[String] = None
}

case class S(override val id: Option[Int] = None,
                  override val addressId: Option[Int] = None,
                  override val name: String,
                  override val about: Option[String] = None,
                  override val numberOfStudents: Option[Int] = None,
                  override val websiteUrl: Option[String] = None,
                  override val mediaId: Option[Int] = None)
    extends STrait

case class SAPI(override val id: Option[Int] = None,
                     override val addressId: Option[Int] = None,
                     override val name: String,
                     override val about: Option[String] = None,
                     override val numberOfStudents: Option[Int] = None,
                     override val websiteUrl: Option[String] = None,
                     override val mediaId: Option[Int] = None,
                     address: Option[Address] = None)
    extends STrait {

  def fromSchool(school: S): SAPI = {
    val schoolApiData = S.unapply(school).get :+ Option.empty[Address]
    (SAPI.apply _).tupled(sApiData)
  }
}

我正在使用shapeless添加一个参数来匹配应用元组中的params列表。但是,出于某种原因,这个S.unapply(school).get :+ Option.empty[Address]不是一个元组,而是被视为prepend.Out。 奇怪的是,如果我在控制台中执行相同的操作并将此行分配给val,那么val的类型就是元组。

我错过了什么?

更新 真有趣的东西。 显然,代码编译得很好。但是,IntelliJ抱怨道: enter image description here

0 个答案:

没有答案