2011-07-28 42 views
5

考慮以下的類:斯卡拉案例類等於實現

trait ModelWithId { 
    var id: Long = 0 
} 
case class EntityAttribute (
    val entityId: UUID, 
    val attrName: String, 
    val stringVal: Option[String], 
    val boolVal: Option[Boolean], 
    val longVal: Option[Long], 
    val doubleVal: Option[Double], 
    val byteVal: Option[Array[Byte]]) extends ModelWithId{ 
    override def toString() : String = { 
"EntityAttribute(" + entityId.hashCode + "," + attrName.hashCode + "," + 
    stringVal.map{_.hashCode}.getOrElse(None) + "," + stringVal.hashCode+ "," + 
    boolVal.map{_.hashCode}.getOrElse(None) + "," + boolVal.hashCode+ "," + 
    longVal.map{_.hashCode}.getOrElse(None) + "," + longVal.hashCode+ "," + 
    doubleVal.map{_.hashCode}.getOrElse(None) + "," + doubleVal.hashCode+ "," + 
    byteVal.map{_.hashCode}.getOrElse(None) + ")" 
    } 
} 

而且下面的對比功能:

val newAtttributes : List[EntityAttribute] 
val withoutIds : List[EntityAttribute] 

println("without: " + withoutIds) 
println("new:  " + newAtttributes) 

    val differences = newAtttributes.diff(withoutIds) 
    println("diff: " + differences) 
    if(newAtttributes.size == 1 && withoutIds.size == 1){ 
    println("==:  " + (newAtttributes.get(0) == withoutIds.get(0))) 
    println("equals: " + (newAtttributes.get(0).equals(withoutIds.get(0)))) 
    println("hequals: " + (newAtttributes.get(0).hashCode == withoutIds.get(0).hashCode)) 
    } 

我得到預想的不同輸出99 100次。偶爾diff函數會返回一個空列表,當它應該是一個列表。

實施例:

without: List(EntityAttribute(428861607,-1147340381,None,120224,None,120224,56,-356863126,None,120224,None)) 
new:  List(EntityAttribute(428861607,-1147340381,None,120224,None,120224,23,424930523,None,120224,None)) 
diff: List() 
==:  false 
equals: false 
hequals: false 

我能夠可靠通常圍繞後10-18迭代重現此錯誤。這兩個名單來自不同的來源,所以它們的構造方式不同。我猜測它與自動裝箱或hashCode的一個糟糕的實現有關,但我一直沒有進展就將我的頭撞到了牆上2天。

我正在使用scala 2.9.0-1。

+1

您可以打印實際值,以便我們實際上可以重現問題... –

+0

您是不是忘記'extends'ModelWithId {'後? –

回答

-1

這兩個EntityAttribute包含longVal的不同值。案例類的默認equals實現考慮到所有成員,因此這使得它們不相等。如果您只想使用會員的子集,您應該定義自己的equalshashCode

+1

沒錯,差異應該是一個大小的列表。 –