Scala抽象类型别名在方法Params中遇到类型类

时间:2014-04-11 09:50:10

标签: scala typeclass type-alias

我尝试将Scala类型类和抽象类别别名组合在一起,但这给我带来了一些问题 看看代码: 我有ModelService

trait ModelService[T] {
  type ID
  def save(t: T): ID
  def find(id: ID): T
}

object ModelService {

  implicit object UserService extends ModelService[User] {
    type ID = Long
    def save(t: User): ID = ???
    def find(id: ID): User = ???
  }

}

我使用类型类来实现:

object ModelHelpers {

  def save[T](model: T)(implicit service: ModelService[T]): service.ID =
    service.save(model)

  def find[T: ModelService](id:) = // here, how can I declare the id's type?
    implicitly[ModelService[T]].find(id)
}

问题是:在ModelHelpers.save中,我可以使用service.ID声明返回类型

但在ModelHelpers.find中,如何声明参数id的类型?

感谢。

1 个答案:

答案 0 :(得分:3)

例如:

type User = String

trait ModelService[T] {
  type ID
  def save(t: T): ID
  def find(id: ID): T
}

object ModelService {
  implicit object UserService extends ModelService[User] {
    type ID = Long
    def save(t: User): ID = t.toLong
    def find(id: ID): User = id.toString
  }
}

object ModelHelpers {
  def save[T](model: T)(implicit service: ModelService[T]): service.ID = service save model
  def find[ID0, T](id: ID0)(implicit service: ModelService[T] { type ID = ID0 }): T = service find id
}

ModelHelpers find 5L // "5": User