Eventuali duplicati:
What is the difference between scala self-types and trait subclasses?Che cosa si intende per auto-annotazione di un oggetto?
capisco un self-un'annotazione come una promessa per il compilatore, in cui il programmatore manifesta che un tratto verrà MixIn con quello annotato. Per esempio:
scala> trait X
defined trait X
scala> trait Y { this: X => }
defined trait Y
scala> new Y {}
<console>:10: error: illegal inheritance;
self-type Y does not conform to Y's selftype Y with X
new Y {}
^
scala> new Y with X {}
res1: Y with X = [email protected]
Nell'esempio precedente, la terza espressione non è riuscita perché non abbiamo fissato un X valida alla nuova istanza. Ovviamente, l'ultimo funziona bene. Fin qui tutto bene. E ora, vediamo un altro esempio che riguarda un oggetto.
scala> object Z { this: X => }
defined module Z
Capisco l'oggetto viene creata un'istanza in mancanza con la X promessa (stiamo creando un'istanza ora con una promessa futura!), Come rappresentato nelle prossime righe, in cui i tratti sono stati leggermente modificati:
scala> trait X { class X1 }
defined trait X
scala> trait Y { this: X => new X1 }
defined trait Y
scala> object Z { this: X => new X1 }
<console>:8: error: not found: type X1
object Z { this: X => new X1 }
^
Quindi, cosa implica l'auto-annotazione dell'oggetto?
Penso che nel caso di classe, ad esempio: "classe A {questo: X => nuovo X1}" puoi giocare con "nuova A con X", quindi ha senso, ma non riesco a trovare alcuna situazione in cui potrebbe essere necessario l'auto-annotazione in un oggetto. – jeslg
Vero, per gli oggetti e le classi finali, non ha senso che io possa vedere. – axel22
Attenzione, penso che gli oggetti possano essere sovrascritti se sono membri di un tratto o di una classe. –