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 = ???
}