unidad interpolacion ejemplos analisis scala generics types polymorphism

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.