对象上的Scala F有界多态性

标签 scala object f-bounded-polymorphism

我无法在 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会使这个习语更有用一点。

关于对象上的Scala F有界多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32203867/

相关文章:

scala - 如何正确定义 f 绑定(bind)多态类型的存在性

java - 用于 java 或 scala 中整数分解的库

jquery - 在 for 循环 (OOP) 中创建并命名 'n' JQuery 对象

javascript - 如何避免重复对象?

scala - 为什么我们可以在 Scala 中使用新类作为父类的类型?

scala - 解析 F 有界多态性中的类型

scala - 在 Apache Spark (v2.3.1) 中的 UDF 内使用 Word2Vec 函数

regex - 数据框列上的 Spark scala 模式匹配

scala - 如何配置 Akka Pub/Sub 在同一台机器上运行?

PHP:如何在数据库对象上使用准备?