Scala: Ist == standardmäßig gleich?

7

Ich lese durch Programmierung in Scala. Es sagt:

  

Sie können das Verhalten von == für neue Typen neu definieren, indem Sie die Methode equals überschreiben, die immer von der Klasse Any übernommen wird. Das vererbte equals , das wirksam wird, wenn es nicht überschrieben wird, ist die Objektidentität, wie es in Java der Fall ist. So ist equals (und damit == ) standardmäßig dasselbe wie eq , aber Sie können sein Verhalten ändern, indem Sie die Methode equals in den von Ihnen definierten Klassen überschreiben. Es ist nicht möglich, == direkt zu überschreiben, da es als letzte Methode in der Klasse Any definiert ist. Das heißt, Scala behandelt == so, als ob sie in der Klasse Any wie folgt definiert wäre:

%Vor%

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
  • Ich kann == direkt überschreiben (ohne Beschwerde vom Compiler, keine override benötigt).

So scheint es mir entweder:

Was ist los?

    
rampion 24.03.2012, 17:04
quelle

1 Antwort

21

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%     
Rex Kerr 24.03.2012, 17:19
quelle

Tags und Links