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。
您可以打印實際值,以便我們實際上可以重現問題... –
您是不是忘記'extends'ModelWithId {'後? –