鉴于DRY,我试图避免在Slick表定义中重复插入和更新逻辑。我试过这个:
trait Entity {
def id: Option[Int]
}
case class BankRekening(id: Option[Int], nummer: String, omschrijving: String) extends Entity{
}
object BankRekeningen extends Table[BankRekening]("bankrekening") with InsertAndUpdate[BankRekening] {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def nummer = column[String]("nummer")
def omschrijving = column[String]("omschrijving")
def * = id.? ~ nummer ~ omschrijving <> (BankRekening, BankRekening.unapply _)
def idx_nummer = index("idx_nummer", nummer, unique = true)
}
trait InsertAndUpdate[T <: Entity] {
this: Table[T] =>
def id: scala.slick.lifted.Column[Int]
def insert(obj: T): T = {
obj.copy(id = Some(this.returning(this.id) insert obj))
}
}
现在编译器在最后一个语句中抱怨'obj',说:找不到scala.slick.lifted.TypeMapper类型的证据参数的隐式值[T]
有什么想法吗?
答案 0 :(得分:2)
简单的答案:你试图在没有复制方法的T上调用副本。
答案很长:不幸的是,Scalac,Scala编译器让Slick(无意中)高举错误消息。您应该看到错误value copy is not a member of T
。如果copy
Scalac以某种方式吞下该消息,因为Slick放在范围内。这是一个简化的复制品:
object simple{
implicit def intColumnType: TypedType[Int] = null
implicit def valueToConstColumn[T : TypedType](v: T) = ConstColumn(v)
}
import simple._
trait TypedType[T]
case class ConstColumn[T](v: T){
def bar = 5
}
trait InsertAndUpdate[T] {
def insert(obj: T): T = {
5.copy() // <- unexpected, but is valid and compiles fine
5.bar // compiles fine
obj.bar // error: value bar is not a member of type parameter T
// error: could not find implicit value for evidence parameter of type TypedType[T]
obj.copy() // error: could not find implicit value for evidence parameter of type TypedType[T]
}
}
正如您所看到的,copy
以某种方式吞下了该消息。另外,我发现消息could not find implicit value for evidence parameter of type TypedType[T]
没有帮助。我创建了一个Scala票证来修复此问题:https://issues.scala-lang.org/browse/SI-7907