While experimenting with some stuff on the REPL, I got to a point where I needed something like this:
scala> class A(x:Int) { println(x); def ==(a:A) : Boolean = { this.x == a.x; } }
Just a simple class with an "==" operator.
Why doesn't it work???
Here's the result:
: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; } } ^
This is scala 2.8 RC1.
Thanks
You have to define the equals(other:Any):Boolean
function, then Scala gives you ==
for free, defined as
class Any{
final def == (that:Any):Boolean =
if (null eq this) {null eq that} else {this equals that}
}
See chapter 28 (Object Equality) of Programming in Scala for more on how to write the equals
function so that it's really an equivalence relation.
Moreover, the parameter x
that you pass to your class isn't stored as a field. You need to change it to class A(val x:Int)
..., and then it will have an accessor that you can use to access a.x
in the equals
operator.
The error message is a little confusing because of coincidence with some code in Predef. But what's really going on here is that you're trying to call the x
method on your A
class, but no method with that name is defined.
Try:
class A(val x: Int) { println(x); def ==(a: A): Boolean = { this.x == a.x } }
instead. This syntax makes x
a member of A
, complete with the usual accessor method.
As Ken Bloom mentioned, however, it's a good idea to override equals
instead of ==
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With