我正在尝试编写一个存储库特征,如:
trait Repository[E <: Entity] {
def exists(id: Long): Boolean
def get(id: Long): E
def insert(entity: E): Unit
def delete(entity: E): Unit
}
此代码的问题是实体可能有一个不是Long的复合键,因此在实现存储库时我遇到了完成特征合同的问题。
我试图将密钥表示为另一个特征的实现,但由于存储库特征无法处理每个实体的特定实现,因此我无法履行合同。
我可以设置exists的参数并获得免费吗?我可以指定依赖de实体键的类型的函数类型吗?
答案 0 :(得分:3)
您可以尝试将复合键表示为元组。
trait Repository[E <: Entity, K] {
def exists(id: K): Boolean
def get(id: K): E
def insert(entity: E): Unit
def delete(entity: E): Unit
}
如果一个名为Thing的实体,其键是String和Long的复合,将是:
class ThingRepository extends Repository[Thing, (String, Long)] {
def exists(id: (String, Long)): Boolean = ???
def get(id: (String, Long)): Thing = ???
def insert(entity: Thing): Unit = ???
def delete(entity: Thing): Unit = ???
}
答案 1 :(得分:-1)
根据我的想法,您可以使用任意而不是长,然后您可以使用大小写匹配进行转换回到你需要的类型。
以下代码编译并应该可以使用,但我还没有尝试过。
trait Repository[E <: Entity] {
def exists(id: Any): Boolean
def get(id: Any): E
def insert(entity: E): Unit
def delete(entity: E): Unit
}
case class SimpleRepository(user: User) extends Repository[User] {
def exists(id: Any) = {
id match {
case key: Long => user.id.equals( key )
case (key: Long, key2: String) =>
user.id.equals( key ) && user.name.equals( key2 )
case _ => false
}
}
def get(id: Any) = {
id match {
case key:Long => user
case _ => user
}
}
def insert(entity: User) = {
}
def delete(entity: User) = {
}
}
不确定您的具体用例,但我希望它有所帮助。