Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使scala类实现==?_Scala - Fatal编程技术网

如何使scala类实现==?

如何使scala类实现==?,scala,Scala,我有一个非案例类,我正在尝试测试它的平等性。它有>22个字段,因此我不能在Scala 2.10.x中使用case类: class Row( val date: String, val time: String, val orderId: String, val id: String) extends Serializable { override def

我有一个非案例类,我正在尝试测试它的平等性。它有>22个字段,因此我不能在Scala 2.10.x中使用case类:

class Row(
                 val date: String,
                 val time: String,
                 val orderId: String,
                 val id: String) extends Serializable {

  override def toString: String = {
    ToStringBuilder.reflectionToString(this);
  }
}

实现==或equals函数以便测试row1==row2的最简单方法是什么?

在您的示例中,Row不是case类。它是一个标准类,因此以标准Java方式检查是否相等

试试这个:

case class Row(date: String,
               time: String,
               orderId: String,
               id: String)

您别无选择,只能实现自己的equals,因此hashcode方法并不容易,因为您无法实现case类。本文将帮助您:。以下是您需要牢记的因素:

注意equals方法的类型签名 重写哈希代码 避免依赖可变状态 如果类不是final,则应实现并使用canEqual方法
不过,另一种选择是,由于Row不是case类,所以仍然需要编写字段对字段的比较代码,即提供scalaztypeclass的实例。这具有类型安全的优点。有关更多信息,请查看。typeclasses 102部分有一个为类型提供相等实例的示例。

您可以添加更多代码吗?您定义行类和创建行实例的准确程度如何?orderId的类型是什么?您粘贴在这里的行类实际上不是一个case类……是的,我刚刚发现了这一点。我一直在为此绞尽脑汁。事实上,我不能使用用例类,因为我有>22个字段……在这种情况下,请更新您的帖子,这样您就不会混淆那些试图帮助您的人。我不能这样做,因为我有超过22个字段。向这个类添加相等的简单方法是什么。我是否可以添加一些类似于toString方法的Commons类?如果类是非final的,为什么我应该只实现canEqual?这是为了将类与其超类松散定义进行比较。如果该类是非最终类,则表示它可以扩展。因此,基类和派生类可能有不同的equals方法实现。这打破了平等的契约,因为比较基类和超类会导致意外的行为。如果你不打算扩展你正在使用的这个类,那么就让它成为最终类。否则,定义一个canEqual方法将重新定义层次结构中类之间相等的概念,使你能够比较类层次结构中不同类型的对象。仍然不清楚TBH。我认为如果一个类是最终的,那么定义canEqual会更安全,因为它不能被子类化。如果类是final,那么就不需要定义canEqual。如果它是非最终的,那么您应该定义它。你需要仔细阅读那篇文章。里面有很多信息,其中有些是微妙的。