Duplicar posible:
What is the difference between scala self-types and trait subclasses?¿Qué significa una auto-anotación de objeto?
entiendo una auto-anotación como una promesa para el compilador, donde el programador se manifiesta en que un rasgo será MixIn con la anotada. Por ejemplo:
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]
En el ejemplo anterior, la tercera expresión fracasó porque no hemos fijado una X válida a la nueva instancia. Obviamente, el último funciona bien. Hasta aquí todo bien. Y ahora, veamos otro ejemplo que involucra un objeto.
scala> object Z { this: X => }
defined module Z
entiendo el objeto se crea una instancia en su defecto con la promesa X (estamos creando una instancia ahora con una promesa futura!), Como se representa en las siguientes líneas, donde los rasgos han sido ligeramente modificados:
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 }
^
Entonces, ¿qué implica la auto-anotación del objeto?
Creo que en el caso de clase, por ejemplo: "clase A {esto: X => nuevo X1}" puede jugar con "nueva A con X", entonces tiene sentido, pero no encuentro ninguna situación donde uno podría necesitar la auto-anotación en un objeto. – jeslg
Es cierto, para los objetos y las clases finales, no tiene sentido que yo pueda ver. – axel22
Eso sí, creo que los objetos pueden ser anulados si son miembros de un rasgo o clase. –