2015-02-10 91 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」部分提供了爲類型提供等式實例的示例)。

相關問題