案例类的Scala类型擦除如何解决

谢尔格达

我有一个特征和两个扩展它的案例类:

trait Authenticatable {
  val email: String
  val pass: String
  val id: Long
  val sessionid: String
}

case class Admin(
  id: Long,
  email: String,
  pass: String,
  sessionid: Option[String] = None) extends Authenticatable

case class Client(
  id: Long,
  email: String,
  pass: String,
  sessionid: Option[String] = None) extends Authenticatable

我有巫婆应该验证用户身份的功能,使用新的sessionid复制对象并返回它。

  def auth(email: String, password: String): Try[Admin] ={
    checkPass(models.Admin.findBy(sqls"email = $email"), password)
  }

  def auth(email: String, password: String, customer: Customer): Try[Customer] ={
    checkPass(models.Customer.findBy(sqls"email = $email"), password)
  }

  private def checkPass (model: Option[Authenticatable], password: String): Try[Authenticatable]={
    model match {
      case Some(m) => check(password, m.pass).map(_ => m)
      case _ => Failure(new Exception("Authentication failure!"))
    }
  }

问题是:我无法在auth函数中复制对象,因为函数checkPass返回Authenticatable而不是Client或Admin类,而Authenticatable没有case类的复制方法。

解决这个问题的正确方法是什么?

如果使用类型参数,则可以避免扔掉checkPass总是返回与Authenticable给定类型相同的信息的信息

private def checkPass[A <: Authenticatable](model: Option[A], password: String): Try[A] =
  // exactly the same body here

这意味着auth您可以拥有例如:

def auth(email: String, password: String): Try[Admin] =
  checkPass(models.Admin.findBy(sqls"email = $email"), password)
    .map(_.copy(sessionid = Some("whatever")))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Scala模式匹配功能-如何解决类型擦除

如何解决Scala上的类型擦除?或者,为什么我无法获取集合的类型参数?

如何解决此Scala函数参数类型擦除错误?

如何解决scala中的类型不匹配

如何解决由方法遮蔽的类的类型参数

如何解决协议和类字段类型之间的冲突?

如何在Scala中部分应用带有类型参数的案例类

如何限制案例类在Scala中具有特定的参数类型构造函数?

如何在Scala案例类中将“ [T]的子代”指定为类型

如何从Scala的案例类中读取内容?

Scala的类型擦除如何用于更高种类的类型参数?

如何获取类中类型参数的擦除类型

如何解决Scala中采用相同输入类型的歧义隐式转换方法?

如何解决此Scala / Play编译错误(返回错误的类型)?

Java类定义的类型推断失败。我该如何解决?

当Typescript检查经典JS类时,如何解决“'this'隐式具有类型'any'”

如何解决“无法解析“RelacionesBundle\Entity\Pregunta”类的“id”列类型”?

在Typescript中将类用作类型时,如何解决循环依赖关系?

什么是泛型泛型?它们如何解决“类型擦除”问题?为什么不进行重大更改就不能添加它们?

如何解决类型不匹配问题?

如何解决不兼容类型错误?

如何解决不兼容的类型?

如何解决F#的类型系统

如何解决类型族冲突的实例?

如何解决pyright的“类型不明”警告?

如何解决“不命名类型”错误

如何解决错误:“MyInheritedWidget”不是类型

如何解决 unhashable 类型:numpy ndarray

如何解决引导类名称冲突