假设我有:
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
做几乎(不完全)相同的事情,这很有效。任何原因?
附言还有,究竟是什么can I do在这样的对象内部强制编译器本身内部的无限循环?
最佳答案
正如您在标题中提到的,工作案例 class AAA extends A[AAA]
是 F-bounded polymorphism 的一个例子,这是一个递归类型定义,其中定义引用自身。递归在类型中相当普遍,即使是不起眼的 List is recursive ;这是一个很好理解的领域。
然而,object AAA extends A[AAA.type]
不是递归类型。这里AAA
是一个值,并且您的声明要求编译器在定义时解析对值类型的引用,这不是 Scala 设计/打算拥有的功能。
关于scala - 为什么我不能在 Scala 中创建 F 有界对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29659927/