2015-04-15 18 views
5

Załóżmy, że mam:Dlaczego nie mogę utworzyć F-ograniczony obiekt w Scala

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

To nie działa:

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

Ale to działa:

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

Robi się prawie (nie do końca) to samo i to działa. Jakiegokolwiek powodu?

P.S. A także, co dokładnie can I do wewnątrz takiego obiektu, aby wymusić cyklu infinte wewnątrz samego kompilatora?

+0

http://blog.originate.com/blog/2014/02/27/types-inside-types-in-scala/, myślę, że to pomogłoby. Ale jaki problem próbujesz rozwiązać z tym? – Governa

+0

Może być powiązany: https://issues.scala-lang.org/browse/SI-5082 – Governa

+1

To samo pytanie tutaj: http://stackoverflow.com/questions/17915353/refer-to-object-type-in-object- definicja, ale nie ma dobrej odpowiedzi –

Odpowiedz

2

Jak wspomina się w tytule, sprawa roboczego class AAA extends A[AAA] jest przykładem F-bounded polymorphism, który jest rekurencyjna definicja typu gdzie definicja odnosi się do siebie. Rekursja jest dość powszechna w typach, nawet pokornych List is recursive; to dość dobrze rozumiane terytorium.

Jednak object AAA extends A[AAA.type] nie jest typem rekursywnym. Tutaj AAA jest wartością o wartości, a deklaracja prosi kompilatora o rozstrzygnięcie odniesienia do typu wartości podczas jej definiowania, co nie jest zdolnością Scala została zaprojektowana/zamierzona.

+0

'AAA.type' jest typem, nie wartością, więc odnoszę się do niego, więc jest ograniczony do F. tylko 'AAA' jest wartością tylko wtedy, gdy używasz jej jako wartości, powiedzmy' val a = AAA'. Domyślnie jest to tylko definicja, która zawiera * zarówno * typ i wartość. – dk14

+0

Nie. "AAA" jest zawsze wartością, nigdy typem, gdy jest obiektem. –

+0

Nie. Jest to typ, gdy robisz "AAA.type", i, w moim przypadku, to 'AAA.type' jest ograniczone do F, jak' typ AAAtyp <: A [typ AAA] ' – dk14

Powiązane problemy