2015-04-15 1 views
5

Angenommen, ich habe:Warum kann ich nicht F-begrenzt Objekt in Scala schaffen

trait A[AA <: A[AA]] 
//or even just ` 
trait A[AA] 

Dies funktioniert nicht:

scala> object AAA extends A[AAA.type] 
<console>:8: error: illegal cyclic reference involving object AAA 
    object AAA extends A[AAA.type] 
         ^

Aber das funktioniert:

scala> class AAA extends A[AAA]; object AAA extends AAA 
defined class AAA 
defined module AAA 

Doing fast (nicht genau) gleich und das funktioniert. Irgendein Grund?

P.S. Und auch, was genau can I do innerhalb eines solchen Objekts, um Infinte-Zyklus im Compiler selbst zu erzwingen?

+0

http://blog.originate.com/blog/2014/02/27/types-inside-types-in-scala/, Ich denke, das würde helfen. Aber welches Problem versuchen Sie damit zu lösen? – Governa

+0

Vielleicht verwandt: https://issues.scala-lang.org/browse/SI-5082 – Governa

+1

Gleiche Frage hier: http://stackoverflow.com/questions/17915353/refer-to-object-type-in-object- Definition, aber keine gute Antwort –

Antwort

2

Wie Sie bereits in Ihrem Titel erwähnt haben, ist der Arbeitsfall class AAA extends A[AAA] ein Beispiel für F-bounded polymorphism, bei dem es sich um eine rekursive Typdefinition handelt, bei der sich die Definition auf sich selbst bezieht. Rekursion ist ziemlich häufig in Typen, selbst die bescheidenen List is recursive; es ist ziemlich gut verstandenes Territorium.

object AAA extends A[AAA.type] ist jedoch kein rekursiver Typ. Hier ist AAA ein Wert, und Ihre Deklaration fordert den Compiler auf, den Verweis auf einen Werttyp während seiner Definition aufzulösen, was keine Fähigkeit ist, die Scala entworfen wurde/haben soll.

+0

'AAA.type' ist ein Typ, kein Wert, also beziehe ich mich darauf, also ist es F-begrenzt. nur "AAA" ist ein Wert nur, wenn Sie es als Wert verwenden, sagen wir "val a = AAA". Standardmäßig ist es nur eine Definition, die * beide * Typ und Wert enthält. – dk14

+0

Nein. AAA ist immer ein Wert, niemals ein Typ, wenn es ein Objekt ist. –

+0

Nein. Es ist ein Typ, wenn Sie 'AAA.type' tun, und in meinem Fall ist dieser' AAA.type' F-begrenzt, wie 'Typ AAAtype <: A [AAAtype]' – dk14