Scala F-bound对象的多态性

Mik*_*yer 6 scala object f-bounded-polymorphism

我不能在Scala中编写以下F-bounded多态.为什么?

trait X[T <: X[T]]
object Y extends X[Y]
Run Code Online (Sandbox Code Playgroud)

我怎样才能表达并编译?

Mil*_*bin 7

看起来你真的应该能够写作,

trait X[T <: X[T]]
object Y extends X[Y.type]
Run Code Online (Sandbox Code Playgroud)

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

scala> object Y extends X[Y.type]
<console>:16: error: illegal cyclic reference involving object Y
       object Y extends X[Y.type]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

如果你想在实际代码中试验这个,那么使用一个包对象来代替它object Fix可以使这个习惯用法更加有用.

  • 与[scala/scala]上的@retronym对话(https://gitter.im/scala/scala?at=55dc7303fcfd5a7865af45d4)表明这是一个错误.它[在Dotty上按预期工作](https://gitter.im/lampepfl/dotty?at=55dc95a3a6bcd8894068e278). (4认同)