Zuerst, warum Sie eine MatchError
sehen. Ein Wert für ein Objekt (A.f) wird als stabiler Bezeichner betrachtet (wie in der Scala-Referenz heißt, "stabile [...] Mitglieder sind Mitglieder, die durch Objektdefinitionen oder Wertdefinitionen nichtflüchtiger Typen eingeführt werden").
Hier ist, was die typer Ausgabe wie folgt aussieht:
object A extends scala.AnyRef {
...
private[this] val f: String = "Object A";
<stable> <accessor> def f: String = A.this.f
}
Wenn in einer Zuweisung verwendet wird, der Compiler „desugars“ Zuordnung dieses stabilen Identifikator (es stabil zu sein, ist eine notwendige Bedingung) in Mustervergleich:
<synthetic> private[this] val x$1: Unit = ("Object B": String("Object B") @unchecked) match {
case A.f =>()
}
Es kann "Objekt B" nicht mit einem Muster "Objekt A" übereinstimmen, so dass es eine MatchError
wirft.
Zu Ihrer größeren Frage: Sie können Werte und Methoden auf einem Begleitobjekt nicht überschreiben/sollten. Polymorphismus gilt für Klassen und ihre Instanzen, nicht für statische Methoden oder Werte. Es gibt wahrscheinlich eine bessere Möglichkeit, über Ihr Programm nachzudenken, bei dem Vals/Defs auf einem Begleitobjekt nicht überschrieben werden.
Danke für die Aufklärung! Ich stimme Ihnen mit der Notwendigkeit überein, Begleitobjekte im Allgemeinen zu überschreiben, aber der Grund, warum ich das hier tun möchte, ist zu Testzwecken, wo ich eine Methode innerhalb des Begleitobjekts durch eine andere Methode ersetzen möchte. Außerdem erlauben einige Sprachen das Überschreiben von statischen Methoden. – deepkimo