2011-07-28 31 views
5

Teniendo en cuenta las siguientes clases:Scala Caso clase es igual a la implementación

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) + ")" 
    } 
} 

Y las siguientes funciones de comparación:

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)) 
    } 

consigo la salida de diferencia esperada 99 de 100 veces. Muy ocasionalmente la función diff devolverá una lista vacía cuando debería una lista de uno.

Ejemplo:

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 

puedo reproducir de forma fiable este error por lo general después de alrededor de 10-18 iteraciones. Las dos listas provienen de diferentes fuentes, por lo que se están construyendo de manera diferente. Supongo que tiene algo que ver con el auto-boxeo o una mala implementación de hashCode, pero he estado golpeando mi cabeza contra la pared durante 2 días sin progreso.

Estoy usando scala 2.9.0-1.

+1

Puede imprimir el valor real para que podamos reproducir el problema ... –

+0

¿no se olvidó de '}' después de 'extender ModelWithId {'? –

Respuesta

-1

Esos dos EntityAttribute contienen diferentes valores para longVal. La implementación predeterminada de equals para las clases de casos toma en cuenta a todos los miembros, por lo que los hace desiguales. Si solo desea utilizar un subconjunto de miembros, debe definir su propio equals y hashCode.

+1

Exactamente, así que diff debería ser una lista de tamaño uno. –

Cuestiones relacionadas