我尝试将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
的类型?
感谢。
答案 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