泛型Scala-trait的类型匹配

泛型Scala-trait的类型匹配,scala,Scala,我只是想了解一下泛型,我想知道是否有更好的方法来实现以下目标: 我有一个密封的trait,它有一个抽象名称和一个重写的equals()。我希望重写的等于在类型和名称上都匹配。下面是我所拥有的 sealed trait NamedCampaign[A <: NamedCampaign] { def name: String override def equals(obj: Any): Boolean = obj match { case x: A => x.name

我只是想了解一下泛型,我想知道是否有更好的方法来实现以下目标:

我有一个密封的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]
sealed trait NamedCampaign[A x.name==this.name
大小写=>false
}
}
案例类AdCampaign(名称:String,目标:String,状态:String,buyingType:String)扩展了NamedCampaign[AdCampaign]
案例类AdSet(名称:String,状态:String,dailyBudget:Int,lifetimeBudget:Int,startTime:Int,endTime:Int,campaign:String)扩展了NamedCampaign[AdSet]

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

由于擦除,您拥有的东西无法工作。运行时不知道类型
a

改编自:



我的两分钱:我认为在一个case类上重写
equals
永远都不合适。当你想要比较所有字段时(比如说,在单元测试中,你很可能想要这么做),你会后悔的.

Hmmmm,这似乎比手工写出两个case类的equals方法更复杂。由于可能只剩下一个case类,您能看到使用类型反射和混合特征的好处吗?
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]
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]
}