scala - 在 Scala 中绑定(bind)引用自身的类型是什么意思?

标签 scala generics f-bounded-polymorphism

我在查看 GitHub 上的一些代码时发现了这个类型声明:

abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product with TreePatternBits {

(这是 from the Spark source code ,尽管这个问题实际上不是关于 Spark 而是关于 Scala 的类型系统。)

这对我来说是新的。用简单的英语来说,这个类型绑定(bind)是什么意思?

最佳答案

几乎没有人阅读有关系统 F 的白皮书(在评论中提到),人们仍在直观地使用 F 绑定(bind)类型多态性。

您只需要了解类/特征 MyType[A <: MyType[A]]强制您将其扩展为 class Impl extends MyType[Impl] ,即作为类型参数传递自身。

trait Interface[A <: Interface[A]] {

  def getValue: String

  def setValue(value: String): A
}

如果你想做这样的事情,这很有用:

class Impl(value: String) extends Interface[Impl] {

  override def getValue: String = value

  override def setValue(value: String): Impl = new Impl(value)
}

没有这个A <: Interface[A] (类型 AImpl[A] 的子类型/扩展)有人可以实现:

// no F-bound type polymorphism
trait Interface[A] {

  def getValue: String

  def setValue(value: String): A
}

class Foo

class Impl extends Inteface[Foo] {

  override def getValue: String = value

  // we wanted to force implementation to have Impl here but now we cannot
  override def setValue(value: String): Foo = new Foo
}

如果您有接口(interface),例如对一些代数建模,例如:

trait Number[A <: Number[A]] {

  def add(a: A): A
}

使实现具有与其自身类型相同的方法输入/输出:

class Integer(val i: Int) extends Number[Integer] {

  def add(a: Integer): Integer = new Integer(i + a.i)
}

它在 OOP 中更受欢迎,因为 FP 提供了使用类型类的替代方法。

关于scala - 在 Scala 中绑定(bind)引用自身的类型是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73442445/

相关文章:

scala - Spark:有没有一种方法可以同时输出spark-shell和spark的类路径?

scala - 为什么Scala中独立代码块的执行时间依赖于执行顺序?

ios - 如何在 Swift 中创建具有多个模型的通用数组?

Java类类型

java - 如何使用泛型类型的构造函数/类型转换

scala - Scala 中的递归数据类型

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

scala - 如何在RDD中展平列表?

arrays - 在 Scala 中为数组添加值

scala - Scala 中具有 F 界类型和存在类型的编译问题