繁体   English   中英

通用Scala特征的类型匹配

[英]Type matching on generic Scala trait

我只是将脚趾插入通用类,并且想知道是否有更好的方法可以实现以下目的:

我有一个密封的特征,它具有抽象名称和重写的equals()。 我希望覆盖的等式在类型和名称上都匹配。 以下是我所拥有的。

sealed trait NamedCampaign[A <: NamedCampaign] {
  def name: String

  override def equals(obj: Any): Boolean = obj match {
    case x: A => x.name == this.name
    case _ => false
  }
}

case class AdCampaign(name: String, objective: String, status: String, buyingType: String) extends NamedCampaign[AdCampaign]
case class AdSet(name: String, status: String, dailyBudget: Int, lifetimeBudget: Int, startTime: Int, endTime: Int, campaign: String) extends NamedCampaign[AdSet]

用外行的话来说,如果两个对象属于同一类并且具有相同的名称,我希望它们被视为相等。 有没有更好/更快/更惯用的方法?

由于擦除,您拥有的东西无法工作。 在运行时未知类型A

从此相关答案改编而成:

sealed trait NamedCampaign[A <: NamedCampaign] {
  implicit def classTagA: ClassTag[A]
  def name: String
  override def equals(obj: Any): Boolean = obj match {
    case classTagA(x) => x.name == this.name
    case _ => false
  }
}

case class AdCampaign(name: String, objective: String, status: String,
  buyingType: String)(implicit val classTagA: ClassTag[AdCampaign])
  extends NamedCampaign[AdCampaign]

case class AdSet(name: String, status: String, dailyBudget: Int,
  lifetimeBudget: Int, startTime: Int, endTime: Int, campaign: String)
  (implicit val classTagA: ClassTag[AdSet]) extends NamedCampaign[AdSet]

编写此代码的更好方法是使用canEqual方法。

sealed trait NamedCampaign {
  def name: String
  def canEqual(that: Any): Boolean
  override def equals(other: Any): Boolean = other match {
    case that: NamedCampaign => (that canEqual this) &&
                                (this.name == that.name)
    case _ => false
  }
}

case class AdCampaign(name: String, objective: String, status: String,
    buyingType: String) extends NamedCampaign {
  override def canEqual(that: Any) = that.isInstanceOf[AdCampaign]
}

case class AdSet(name: String, status: String, dailyBudget: Int,
    lifetimeBudget: Int, startTime: Int, endTime: Int, campaign: String)
    extends NamedCampaign {
  override def canEqual(that: Any) = that.isInstanceOf[AdSet]
}

我的两分钱:我认为在案例类中覆盖均equals是不合适的。 当您想要比较所有字段时(当您可能想在单元测试中进行此操作时),您会后悔。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM