【问题标题】:Why I can't create F-bounded object in Scala为什么我不能在 Scala 中创建 F 有界对象
【发布时间】:2015-06-21 23:40:36
【问题描述】:

假设我有:

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 来强制编译器本身内部的无限循环?

【问题讨论】:

标签: scala generics types polymorphism


【解决方案1】:

正如您在标题中提到的那样,工作案例class AAA extends A[AAA]F-bounded polymorphism 的一个示例,这是一个递归类型定义,其中定义引用自身。递归在类型中相当普遍,即使是不起眼的List is recursive;这是一个很好理解的领域。

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

【讨论】:

  • AAA.type 是类型,不是值,所以我指的是它,所以它是 F 有界的。只有AAA 是一个值,只有当你将它用作一个值时,比如说val a = AAA。默认情况下,它只是一个定义,包括 both 类型和值。
  • 不。 AAA 始终是一个值,而不是一个类型,当它是一个对象时。
  • 不。当您执行AAA.type 时,它是一种类型,并且在我的情况下,此AAA.type 是F 有界的,例如type AAAtype &lt;: A[AAAtype]
  • 当你定义一个对象时,类型定义是“免费的”(并且可以通过type keyword 访问),并且它同样是F-bounded它指的是它自己。显然,对象的值不能引用类型。
  • 试试type AAAtype = A[AAAtype] 你会得到和我一样的错误,因为这就是正在发生的事情。 Scala 不允许 F 有界类型成员。对于对象的情况,这似乎是非常错误的。
猜你喜欢
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
相关资源
最近更新 更多