Ich lese durch Programmierung in Scala. Es sagt:
Sie können das Verhalten von
%Vor%==
für neue Typen neu definieren, indem Sie die Methodeequals
überschreiben, die immer von der KlasseAny
übernommen wird. Das vererbteequals
, das wirksam wird, wenn es nicht überschrieben wird, ist die Objektidentität, wie es in Java der Fall ist. So istequals
(und damit==
) standardmäßig dasselbe wieeq
, aber Sie können sein Verhalten ändern, indem Sie die Methodeequals
in den von Ihnen definierten Klassen überschreiben. Es ist nicht möglich,==
direkt zu überschreiben, da es als letzte Methode in der KlasseAny
definiert ist. Das heißt, Scala behandelt==
so, als ob sie in der KlasseAny
wie folgt definiert wäre:
Aber das stimmt nicht mit dem überein, was ich in scala 2.9.1 sehe, wo es so aussieht:
==
scheint nicht standardmäßig auf equals
zu verweisen
==
direkt überschreiben (ohne Beschwerde vom Compiler, keine override
benötigt). So scheint es mir entweder:
Ich mache es falsch - diese Definition von Rational
gibt
oder ich lese eine veraltete Version des Buches, und die Dinge haben sich geändert.
Was ist los?
Sie machen einen sehr verständlichen Fehler - Sie versuchen, ein typsicheres equals (d. h. def equals(r: Rational)
) anstelle eines generischen equals (d. h. override def equals(a: Any)
) zu schreiben.
Anstatt also equals
zu überschreiben - beachten Sie, dass Sie das Schlüsselwort override
nicht benötigen! - Sie erstellen eine andere Methode, indem Sie die Typparameter überladen und dann zwei gleich ist Methoden, eine, die Rational
und eine, die Any
dauert. Das Gleiche gilt für ==
; Nur die Any
-parametrisierte Methode kann nicht überschrieben werden.
Um das Verhalten mit Java (und der Scala-Bibliothek) konsistent zu machen, müssten Sie equals als etwas wie
schreiben %Vor%