Scala F-bound对象的多态性

时间:2015-08-25 12:20:05

标签: scala object f-bounded-polymorphism

我无法在Scala中编写以下F-bounded多态。为什么呢?

trait X[T <: X[T]]
object Y extends X[Y]

我如何表达并将其编译?

2 个答案:

答案 0 :(得分:7)

看起来你应该能够写作,

trait X[T <: X[T]]
object Y extends X[Y.type]

但是,如果您尝试编译器会给您一个无用的(我认为是虚假的)错误,

scala> object Y extends X[Y.type]
<console>:16: error: illegal cyclic reference involving object Y
       object Y extends X[Y.type]

我说&#34;虚假&#34;因为我们可以构建一个具有一点额外基础设施的等效对象,

trait X[T <: X[T]]

trait Fix { type Ytype >: Y.type <: Y.type; object Y extends X[Ytype] }
object Fix extends Fix { type Ytype = Y.type }
import Fix.Y

如果你想在实际代码中试验这一点,使用包对象代替object Fix会使这个习惯用法更加有用。

答案 1 :(得分:1)

将其更改为:

  trait Y extends X[Y]

object不是Scala中的类型,而是所谓的伴随对象。 通过定义object Y,您无法表达它应该扩展trait T[Y],因为第二个Y指的是尚未定义的类型Y。 但是,您可以执行以下操作:

trait Y extends X[Y]          //If you try this on the REPL, do :paste before
object Y extends X[Y]

在这种情况下,对象Y扩展X[Y],其中第二个Y是您刚定义的特征,请务必记住这一点。