2011-07-28 138 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

没错,差异应该是一个大小的列表。 –