方法##和有hashCode什么区别?
无论hashCode我使用哪个类或重载,它们似乎都输出相同的值.谷歌也没有帮助,因为它找不到符号##.
我不太明白为什么当我们将两个实例与一个类的相同属性进行比较而不重写equals它将给出的方法时false.但是,true当我们比较一个案例类的两个实例时,它会给出一个.例如
class A(val name: String, val id: Int)
case class B(name: String, id: Int)
object Test {
val a1 = new A('a',1)
val a2 = new A('a',1)
println(a1 == a2) //this returns false
var b1 = B('b',1)
var b2 = B('b',1)
println(b1 == b2) //this returns true
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释原因吗?
我想定义一个名称Ext,它将现有equals方法重命名为,equalsByAttributes并同时定义一个新equals方法.该特征用于扩展案例类.我目前的解决方案看起来有点hacky:
case class A(id: Int) extends Ext
trait Ext { p: Product =>
// new implementation
override def equals(obj: Any) = obj match {
case that: AnyRef => this eq that
case _ => false
}
// reimplementation of old equals implementation
def equalsByAttributes(obj: Any) = obj match {
case that: Product =>
if (this.getClass.isAssignableFrom(that.getClass) || that.getClass.isAssignableFrom(this.getClass))
p.productIterator.toList == that.productIterator.toList
else
false
case _ => false
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道是否有引用一个直接的方式A的equals …
我不是在讨论String类或任何其他重写hashcode的类.假设我只是创建了一个Object类的新对象,那么hashcode()无论如何都会identityHashCode(Object x)返回true,返回该对象的内存地址?