我正在尝试使用Slick开发自动REST CRUD。
行为如下。如果我调用GET /events
,我想获得有关令牌events
的信息(我的意思是,获取模型,主键的类型和表定义)。
当我尝试编写创建具有上限参数的泛型类的工厂时,我陷入困境。
我希望我的工厂创建DaoService
:
trait Entity
// `Table` is defined in Slick
abstract class PKTable[E, PK](tag: Tag, tableName: String) extends Table[E](tag, tableName){
def id: Rep[PK]
}
// `BaseColumnType` is necessary to compare ids in the `find` method
// `Expect` is a custom `Either`
class DaoService[E <: Entity, PK <: BaseColumnType[PK], V <: PKTable[E, PK]] {
def findAll(tableQuery: TableQuery[V]): Future[Expect[Seq[E]]] =
dao.runForAll(tableQuery)
def find(tableQuery: TableQuery[V], id: PK): Future[Expect[Option[E]]] =
dao.runForHeadOption(tableQuery.filter(_.id === id))
// ....
}
我的工厂看起来像:
class Factory @Inject()(dao: Dao){
def create(token: String): Option[DaoService[_, _, _]] = token match {
case "events" => Some(new DaoService[Event, UUID, EventTableDef](dao))
case _ => None
}
}
但是我收到了这个错误:
[error] test.scala:30: type arguments [Event,UUID,EventTableDef] do not conform to class DaoService's type parameter bounds [E <: Entity,PK <: BaseColumnType[PK],V <: PKTable[E,PK]]
[error] case "events" => Some(new DaoService[Event, UUID, EventTableDef](dao))
[error] ^
我尝试了很多解决方案,但没有任何效果。我不明白为什么不推断类型。有任何想法解决我的问题吗?