假设我有:
trait A[AA <: A[AA]]
//or even just `
trait A[AA]
这不起作用:
scala> object AAA extends A[AAA.type]
<console>:8: error: illegal cyclic reference involving object AAA
object AAA extends A[AAA.type]
^
但这有效:
scala> class AAA extends A[AAA]; object AAA extends AAA
defined class AAA
defined module AAA
做几乎(不完全)相同,这是有效的。有什么原因吗?
P.S。而且,这个对象内部究竟是can I do来强制编译器本身内部的infinte循环?
答案 0 :(得分:2)
正如您在标题中所提到的,工作案例class AAA extends A[AAA]
是F-bounded polymorphism的示例,它是一个递归类型定义,其中定义引用自身。递归在类型中相当普遍,甚至是卑微的List is recursive;它是一个相当容易理解的领域。
但是,object AAA extends A[AAA.type]
不是递归类型。这里AAA
是值,您的声明要求编译器在定义值时解析对值类型的引用,这不是Scala设计的功能/打算拥有。