interpolacion - Por qué no puedo crear un objeto delimitado por F en Scala
javascript interpolacion de variables (1)
Supongamos que tengo:
trait A[AA <: A[AA]]
//or even just `
trait A[AA]
Esto no funciona:
scala> object AAA extends A[AAA.type]
<console>:8: error: illegal cyclic reference involving object AAA
object AAA extends A[AAA.type]
^
Pero esto funciona:
scala> class AAA extends A[AAA]; object AAA extends AAA
defined class AAA
defined module AAA
Haciendo casi (no exactamente) lo mismo y esto funciona. ¿Cualquier razón?
PS Y también, ¿qué puedo hacer exactamente dentro de ese objeto para forzar el ciclo ininteligible dentro del compilador?
Como usted alude en su título, la clase de caso de trabajo class AAA extends A[AAA]
es un ejemplo de polimorfismo limitado a F , que es una definición de tipo recursivo donde la definición se refiere a sí misma. La recursividad es bastante común en los tipos, incluso la humilde Lista es recursiva ; es un territorio bastante bien entendido.
Sin embargo, el object AAA extends A[AAA.type]
no es un tipo recursivo. Aquí, AAA
es un valor , y su declaración le pide al compilador que resuelva la referencia al tipo de un valor mientras se está definiendo, que no es una capacidad que Scala haya sido diseñada / tenga la intención de tener.