Scala Case Class等于实现
发布时间:2020-12-16 18:27:42 所属栏目:安全 来源:网络整理
导读:鉴于以下课程: 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
鉴于以下课程:
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,56,-356863126,None)) new: List(EntityAttribute(428861607,23,424930523,None)) diff: List() ==: false equals: false hequals: false 通常在大约10-18次迭代后,我可以可靠地重现此错误.这两个列表来自不同的来源,因此它们的构造方式不同.我猜它与自动装箱或者糟糕的hashCode实现有关,但我一直在抨击墙壁2天没有进展. 我正在使用scala 2.9.0-1. 解决方法
这两个EntityAttribute包含longVal的不同值.案例类的默认等于实现将所有成员考虑在内,因此使它们不相等.如果您只想使用成员的子集,则应定义自己的equals和hashCode.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |