我正在尝试为Slick 2.0编写一个通用的CRUD特性。该特征应 a)提供从数据库中读取/更新/删除实体以及 b)摘要的通用方法。在this slick example(数据库抽象)和this article(CRUD特征)之后,我提出了以下(缩短的)代码片段:
trait Profile {
val profile: JdbcProfile
}
trait Crud[T <: AbstractTable[A], A] { this: Profile =>
import profile.simple._
val qry: TableQuery[T]
def countAll()(implicit session: Session): Int = {
qry.length.run
}
def getAll()(implicit session: Session): List[A] = {
qry.list // <-- type mismatch; found: List[T#TableElementType] required: List[A]
}
}
由于类型不匹配,代码无效。第二个函数的返回类型似乎是List[T#TableElementType]
类型,但需要是List [A]。关于如何解决问题的任何想法。另外还可以参考有关通用Slick 2.0操作的进一步阅读。
答案 0 :(得分:2)
type TableElementType
在class AbstractTable[A]
内是抽象的。 Scala不了解A
和TableElementType
之间的任何关系。另一方面,class Table
定义final type TableElementType = A
,它告诉Scala关于这种关系(显然Scala足够聪明,可以使用final
注释来知道关系甚至适用于子类型{{ 1}} eventhough T <: Table[A]
在Table[A]
}中不是共变体。
因此,您需要使用A
代替T <: Table[A]
。而且因为T <: AbstractTable[A]
位于光滑的驱动蛋糕内(如蛋糕模式),你需要将你的Crud移动到你的蛋糕中。蛋糕是病毒。
Table