Scala 自由参数特征法
我正在尝试编写一个存储库特性,如:Scala 自由参数特征法,scala,Scala,我正在尝试编写一个存储库特性,如: trait Repository[E <: Entity] { def exists(id: Long): Boolean def get(id: Long): E def insert(entity: E): Unit def delete(entity: E): Unit } trait Repository[E我突然想到,你可以使用Any而不是Long,然后你可以使用case match将其转换回你需要的类型 下面的代码经过编译,
trait Repository[E <: Entity] {
def exists(id: Long): Boolean
def get(id: Long): E
def insert(entity: E): Unit
def delete(entity: E): Unit
}
trait Repository[E我突然想到,你可以使用Any而不是Long,然后你可以使用case match将其转换回你需要的类型
下面的代码经过编译,应该可以工作,但我还没有尝试过
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) = {
}
}
trait Repository[E user.id.equals(key)
大小写(键:长,键2:字符串)=>
user.id.equals(键)和&user.name.equals(键2)
大小写=>false
}
}
def get(id:Any)={
身份证匹配{
大小写键:Long=>user
案例=>用户
}
}
def插入(实体:用户)={
}
def delete(实体:用户)={
}
}
不确定您的具体用例,但我希望它能有所帮助。您可以尝试将复合键表示为元组
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
}
为Long
”或抽象类型别名向Repository
添加另一个类型参数怎么样?这很好。不过,我认为如果您可以将密钥的责任委托给实体(实体[K]),然后在存储库中获取密钥的类型,会更好。尽您所能(据我所知)是强制执行正确性,即trait存储库[K,e]
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 = ???
}