我有一个案例类,它有2个Long
和String
类型的参数。我假设自动生成的equals()
方法可以按预期工作(这意味着它确实检查(Long, String)
对是否相同),但显然它并不总是这样做。似乎Scala生成了equals方法,在该方法中,它使用==
运算符检查每个成员的相等性。这是对的吗?
答案 0 :(得分:3)
在Scala中,equals
和==
基本相同,只有==
处理null
,正如here所解释的那样,或{{3} }}:
表达式
x == that
相当于if (x eq null) that eq null else x.equals(that)
。
建议一般使用==
。使用eq
(罕见)检查引用相等性。
对于案例类,equals
会自动实施(因此==
路由到equals
也是如此:
case class Foo(a: Long, b: String)
val foo1 = Foo(1L, "")
val foo2 = Foo(1L, "")
val foo3 = Foo(2L, "")
foo1 == foo2 //true
foo1.equals(foo2) //true
foo1 == foo3 //false
foo1.equals(foo3) //false
来自docs:
对于每个案例类,Scala编译器都会生成
equals
方法 它实现了结构相等性和toString
方法。