在尝试使用REPL上的一些内容时,我得到了一个我需要这样的东西:
scala> class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } }
只是一个带有“==”运算符的简单类。
为什么不起作用?
结果如下:
:10: error: type mismatch; found : A required: ?{val x: ?} Note that implicit conversions are not applicable because they are ambiguous: both method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A] and method any2Ensuring in object Predef of type [A](x: A)Ensuring[A] are possible conversion functions from A to ?{val x: ?} class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } } ^
这是scala 2.8 RC1。
由于
答案 0 :(得分:15)
你必须定义equals(other:Any):Boolean
函数,然后Scala免费提供==
,定义为
class Any{
final def == (that:Any):Boolean =
if (null eq this) {null eq that} else {this equals that}
}
有关如何编写equals
函数以使其真正成为等价关系的更多信息,请参阅Scala编程的第28章(对象平等)。
此外,传递给您的类的参数x
不会存储为字段。您需要将其更改为class A(val x:Int)
...,然后它会有一个访问者,您可以使用该访问者访问a.x
运算符中的equals
。
答案 1 :(得分:7)
由于与Predef中的某些代码重合,错误消息有点令人困惑。但是这里真正发生的是你试图在x
类上调用A
方法,但没有定义具有该名称的方法。
尝试:
class A(val x: Int) { println(x); def ==(a: A): Boolean = { this.x == a.x } }
代替。此语法使x
成为A
的成员,并使用通常的访问器方法。
正如Ken Bloom所提到的,最好覆盖equals
而不是==
。