In primo luogo, perché si vede uno MatchError
. Un valore su un oggetto (A.f) è considerato un identificatore stabile (come dice il riferimento di Scala, "I membri stabili sono [...] membri introdotti da definizioni di oggetti o da definizioni di valori di tipi non volatili").
Ecco cosa l'uscita typer assomiglia:
object A extends scala.AnyRef {
...
private[this] val f: String = "Object A";
<stable> <accessor> def f: String = A.this.f
}
Quando utilizzato in un incarico, il compilatore "desugars" assegnazione di questo identificatore stabile (che sia stabile è una condizione necessaria) nel pattern matching:
<synthetic> private[this] val x$1: Unit = ("Object B": String("Object B") @unchecked) match {
case A.f =>()
}
Non può corrispondere "Oggetto B" a un motivo "Oggetto A", quindi genera uno MatchError
.
Alla tua domanda più grande: non puoi/non deve sovrascrivere valori e metodi su un oggetto associato. Il polimorfismo si applica alle classi e alle relative istanze, non ai metodi o ai valori statici. C'è probabilmente un modo migliore di pensare al tuo programma che non coinvolga vals/defs sovrascrivibili su un oggetto companion.
fonte
2013-04-30 19:25:52
Grazie per il chiarimento! Concordo con te sulla necessità di ignorare gli oggetti companion in generale, ma la ragione per cui voglio farlo qui è a scopo di test, dove voglio sostituire un metodo all'interno dell'oggetto companion con un altro metodo. Inoltre, alcuni linguaggi consentono l'override dei metodi statici. – deepkimo