Shapeless: ошибка компиляции объектива для параметра типа класса - PullRequest
0 голосов
/ 10 мая 2018

Я определил базовую черту для всех классов дел и намереваюсь изменить поля (например, createTime, updateTime) в базовой черте с помощью бесформенного объектива.

На основе следующих кодов.

// LensTest.scala

package demo

import java.sql.Timestamp

import shapeless._

trait BaseEntity {
  def id: Int
  def createTime: Timestamp
  def updateTime: Timestamp
}

case class User(id: Int, name: String, age: Int, createTime: Timestamp, updateTime: Timestamp) extends BaseEntity

object Util {
  val witCreateTime = Witness('createTime)
  type tpeCreateTime = witCreateTime.T

  def updateCreateTime[A](a: A, time: Timestamp)(implicit mkLens: MkFieldLens.Aux[A, tpeCreateTime, Timestamp]): A = {
    val lenCreateTime = mkLens()
    lenCreateTime.set(a)(time)
  }
}

/**
  * LensTest
  *
  */
object LensTest extends App {
  val user = User(1, "Tom", 18, null, null)
  val now = new Timestamp(System.currentTimeMillis())

  def normal_method_call_is_ok(): Unit = {
    println(Util.updateCreateTime(user, now))
  }
  normal_method_call_is_ok()

  // However, in the below `BaseRepo` definition,
  // Compiler gives an compile error:
  //
  //     could not find implicit value for parameter mkLens: shapeless.MkFieldLens.Aux[E,demo.Util.tpeCreateTime,java.sql.Timestamp]
  //
  //
  // Why? And how to fixed it?
}


class BaseRepo[E <: BaseEntity] {
  def beforeUpdate(e: E): E = {
    val now = new Timestamp(System.currentTimeMillis())
    Util.updateCreateTime(e, now)
  }
}

Как меня прокомментировали в коде. Я написал updateCreateTime функцию для достижения моей цели. Это работает, когда я вызываю это в нормальной функции. Однако, когда я поместил его в класс BaseRepo (который имеет параметры типа), компиляция не удалась. Я не знаю, почему это произошло, и как это исправить? Любая помощь будет благодарна.

1 Ответ

0 голосов
/ 10 мая 2018

Дайте компилятору то, что ему нужно:

class BaseRepo[E <: BaseEntity] {
  def beforeUpdate(e: E)(implicit in: MkFieldLens.Aux[E, tpeCreateTime, Timestamp]): E = {
    val now = new Timestamp(System.currentTimeMillis())
    Util.updateCreateTime(e, now)
  }
}

object LensTest extends App {
  val user = User(1, "Tom", 18, null, null)
  val now = new Timestamp(System.currentTimeMillis())

  def normal_method_call_is_ok(): Unit = {
    println(Util.updateCreateTime(user, now))
  }
  //normal_method_call_is_ok()

  val _user = new BaseRepo[User]
  println(_user.beforeUpdate(user))
  // However, in the below `BaseRepo` definition,
  // Compiler gives an compile error:
  //
  //     could not find implicit value for parameter mkLens: shapeless.MkFieldLens.Aux[E,demo.Util.tpeCreateTime,java.sql.Timestamp]
  //
  //
  // Why? And how to fixed it?
}

Дает:

Пользователь (1, Том, 18,2018-05-10 11: 39: 50,287, ноль)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...