scala - 为什么我不能在 Scala 中创建 F 有界对象

标签 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

做几乎(不完全)相同的事情,这很有效。任何原因?

附言还有,究竟是什么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/

相关文章:

java - 在通用列表中公开下一个/上一个指针

Swift 编译器无法解析泛型函数中数组的 + 运算符的正确重载

generics - F# 编译错误 : Unexpected type application

c# - 为什么这些 Type 对象不相等?

typescript ,合并对象类型?

oop - 为什么没有为不同的返回类型定义方法重载?

java - Spark : timestamp changes when reading from written file

c - 具有定义宽度的整数类型

scala - 在 map 中访问另一个 rdd

scala - 为什么 Actor "ask"模式被视为反模式或 "code smell?"