我在以通用方式使用 Slick 的 TableQuery 时遇到问题。
观察常规情况:
class AccountRepository {
override protected val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
val accounts = TableQuery[Accounts]
def all = db.run(accounts.result)
...
这个想法是将所有可能的东西提取到通用特征或抽象类中以避免重复。为了简单起见,我只包含有问题的代码。
abstract class GenericRepository[T] extends HasDatabaseConfig[JdbcProfile] {
override protected val dbConfig = DatabaseConfigProvider.get[JdbcProfile(Play.current)
val table = TableQuery[T]
}
并像这样使用它:
class AccountRepository extends GenericRepository[Accounts] {
但是,这会产生编译错误:
类型参数 [T] 不符合 value apply 的任何重载替代项的边界: [E <: slick.lifted.AbstractTable[ ]]=> slick.lifted.TableQuery[E] [E <: slick.lifted.AbstractTable [ ]](缺点:slick.lifted.Tag => E)slick.lifted.TableQuery[E]
尝试通过设置边界来解决问题也无济于事。
abstract class GenericRepository[T <: slick.lifted.AbstractTable[T]] extends HasDatabaseConfig[JdbcProfile] {
然而,我们最终得到一个不同的错误:
需要类类型但找到 T
在以下地方:
val table = TableQuery[T]
关于解决方案的任何想法?