2015-04-15 26 views
5

varsayalım Ben:Ben Scala F-sınırlanmış nesne oluşturamıyor Neden

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

Bu işe yaramazsa:

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

Ama bu işleri:

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

Hemen hemen aynı (tam olarak) değil ve bu çalışır. Herhangi bir nedenle?

P.S. Ve ayrıca, bu nesnenin içinde tam olarak can I do ne derleyici kendi içinde infinte döngüsü zorlamak için?

+0

http://blog.originate.com/blog/2014/02/27/types-inside-types-in-scala/, Bunun yardımcı olacağını düşünüyorum. Ama bununla ne tür bir problem çözmeye çalışıyorsunuz? – Governa

+0

Belki ilgili: https://issues.scala-lang.org/browse/SI-5082 – Governa

+1

Aynı soru burada: http://stackoverflow.com/questions/17915353/refer-to-object-type-in-object- tanımı, ama iyi bir cevap yok –

cevap

2

Başlığınızda ima ettiğiniz gibi, class AAA extends A[AAA] çalışma durumu F-bounded polymorphism örneğidir; bu, tanımın kendisi ile ilgili olduğu özyinelemeli bir tür tanımdır. Recursion türlerde oldukça yaygındır, hatta mütevazı List is recursive; Oldukça iyi anlaşılmış bölge.

Ancak, object AAA extends A[AAA.type] özyinelemeli bir tür değil. Burada AAA, değeri'dur ve beyannız, derleyicinin, tanımlanırken bir değerin türünü çözümlemesi için derleyiciden sormasını ister; bu, Scala'nın tasarlanması/tasarlanması için bir yetenek değildir.

+0

'AAA.type' nesnesinin bir tür değil, bir değer olduğunu, bu yüzden buna başvurduğum anlamına gelir, bu yüzden F-sınırlı. sadece “AAA”, sadece bir değer olarak kullanırsanız, “val a = AAA” diyelim. Varsayılan olarak, yalnızca * türünü ve değerini içeren bir tanımdır. – dk14

+0

Hayır. “AAA”, bir nesnesi olduğunda her zaman bir değer, asla bir tiptir. –

+0

Hayır. 'A.txt' türünde yaptığınız bir tiptir ve benim durumumda bu 'AAA.type', bir nesneyi tanımladığınızda, tür tanımındaki tür: tür AAAtype <: A [AAAtype] ' – dk14