我无法在 Scala 中编写以下 F 界多态性。为什么?
trait X[T <: X[T]]
object Y extends X[Y]
我该如何表达并使其编译?
看来你确实应该能够写作,
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]
我说“虚假”是因为我们可以用一点额外的基础设施构建一个等效的对象,
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
会让这个习语更有用一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)