为什么我不能在Scala中创建F-bounded对象

dk1*_*k14 5 generics polymorphism types scala

假设我有:

trait A[AA <: A[AA]]
//or even just `
trait A[AA]
Run Code Online (Sandbox Code Playgroud)

这不起作用:

scala> object AAA extends A[AAA.type]
<console>:8: error: illegal cyclic reference involving object AAA
   object AAA extends A[AAA.type]
                        ^
Run Code Online (Sandbox Code Playgroud)

但这有效:

scala> class AAA extends A[AAA]; object AAA extends AAA
defined class AAA
defined module AAA
Run Code Online (Sandbox Code Playgroud)

做几乎(不完全)相同,这是有效的.任何原因?

PS而且,在这样的对象中究竟能做些什么来强制编译器本身内部的infinte循环?

Ben*_*son 2

正如您在标题中提到的,工作案例class AAA extends A[AAA]F-bounded polymorphism的一个示例,它是一个递归类型定义,其中定义引用自身。递归在类型中相当常见,即使是不起眼的List 也是递归的;这是一个相当容易理解的领域。

但是,object AAA extends A[AAA.type]不是递归类型。这AAA是一个,您的声明要求编译器在定义值时解析对值类型的引用,这不是 Scala 设计/打算具有的功能。