2015-02-10 99 views
0

我有一个非案例类,我试图测试它是否相等。它具有> 22场,所以我不能在斯卡拉2.10.x使用的情况下类:如何制作一个Scala类实现==?

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

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

什么是我实现一个==最简单的方法或等于功能,所以我可以测试row1 == row2

+0

您可以添加更多代码 - 您如何精确定义“Row”类并创建“Row”实例? – DNA 2015-02-10 16:25:04

+0

orderId的类型是什么? – SMA 2015-02-10 16:26:19

+1

你在这里粘贴的'Row'类实际上不是'case class' ... – Marth 2015-02-10 16:35:00

回答

0

你别无选择,只能实现自己的equals因此hashcode方法(不容易),因为你无法实现case类。本文应该可以帮助您:object equality。这些都是你需要牢记的因素:

  1. 照顾与equals方法的类型签名
  2. 覆盖上可变状态的hashCode()
  3. 避免依赖
  4. 应提供和使用canEqual方法如果类是non-final
+0

该链接不正确.. – jbrown 2015-02-10 16:48:26

+1

修正该链接 – 2015-02-10 16:49:56

+1

谢谢。我现在在里面哭泣...... – jbrown 2015-02-10 16:52:07

0

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

试试这个:

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

啊。我实际上做不到这一点,因为我有> 22个字段。什么是向这个班级添加平等的简单方法。是否有一些可以添加类似toString方法的Commons类? – jbrown 2015-02-10 16:38:15

0

另一种选择(虽然,因为行不是案例类,仍然涉及到writin g字段逐场比较代码)将提供Scalaz Equal类型类的一个实例。这具有类型安全的优点。欲了解更多信息,请查看Learning Scalaz series。 (“类型类102”部分提供了为类型提供等式实例的示例)。