2012-06-28 15 views
5

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?

Respuesta

3

De hecho, puede hacer lo mismo con las clases: agregue un tipo propio que no sea heredado, pero no podrá crear una instancia de dicha clase.

Permitir que los objetos únicos tengan tipos propios no invalida los programas de ninguna manera; simplemente no podrá llamar a ninguno de los métodos del tipo propio (o instanciar sus clases internas) desde el objeto singleton, porque no heredó el tipo de sí mismo.

Sin embargo, puede ser un error, es posible que desee file a bug.

+0

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

+0

Es cierto, para los objetos y las clases finales, no tiene sentido que yo pueda ver. – axel22

+0

Eso sí, creo que los objetos pueden ser anulados si son miembros de un rasgo o clase. –

Cuestiones relacionadas