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

时间:2015-04-15 20:09:43

标签: scala generics types polymorphism

假设我有:

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循环?

1 个答案:

答案 0 :(得分:2)

正如您在标题中所提到的,工作案例class AAA extends A[AAA]F-bounded polymorphism的示例,它是一个递归类型定义,其中定义引用自身。递归在类型中相当普遍,甚至是卑微的List is recursive;它是一个相当容易理解的领域。

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