如何设计一个工厂,使用字符串标记创建具有上限参数的泛型类

时间:2016-11-17 10:30:20

标签: scala generics types playframework slick

我正在尝试使用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]                        ^

我尝试了很多解决方案,但没有任何效果。我不明白为什么不推断类型。有任何想法解决我的问题吗?

0 个答案:

没有答案