[英]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.